From 0429dcb4f7fba69a6c36eacb1b7f1d887f992c35 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:43:43 +0000 Subject: [PATCH 01/10] feat: upgrade build processing and linting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit โ€ข Standardize linting configs across all packages (.solhint.json, .markdownlint.json) โ€ข Remove deprecated natspec-smells and storage verification scripts โ€ข Add new utility scripts (check-todos.sh, lint-staged-run.sh, verify-solhint-disables.js) โ€ข Update CI workflows and pnpm workspace configuration --- .github/workflows/build-test.yml | 6 +- .github/workflows/lint.yml | 18 - .gitignore | 7 +- .markdownlint.json | 6 +- .markdownlintignore | 15 +- .prettierignore | 11 +- README.md | 201 +- eslint.config.mjs | 23 - natspec-smells.config.js | 27 - package.json | 75 +- packages/address-book/.markdownlint.json | 3 + packages/address-book/package.json | 6 +- packages/contracts/.solhint.json | 3 + packages/contracts/package.json | 28 +- packages/contracts/task/package.json | 16 +- packages/contracts/task/prettier.config.cjs | 5 + packages/contracts/task/tsconfig.json | 2 +- packages/contracts/test/hardhat.config.ts | 1 + packages/contracts/test/package.json | 22 +- packages/contracts/test/prettier.config.cjs | 5 + packages/contracts/test/scripts/coverage | 2 - packages/contracts/test/scripts/test | 4 +- .../tests/unit/governance/governed.test.ts | 4 +- .../tests/unit/l2/l2GraphTokenGateway.test.ts | 17 +- .../contracts/test/tests/unit/lib/fixtures.ts | 4 +- .../test/tests/unit/rewards/rewards.test.ts | 184 +- .../tests/unit/staking/configuration.test.ts | 6 +- packages/data-edge/.solhint.json | 3 + packages/data-edge/package.json | 25 +- packages/data-edge/scripts/test | 4 +- packages/hardhat-graph-protocol/README.md | 20 +- packages/hardhat-graph-protocol/package.json | 26 +- packages/horizon/.markdownlint.json | 3 + packages/horizon/natspec-smells.config.js | 11 - packages/horizon/package.json | 32 +- packages/horizon/tsconfig.json | 3 +- packages/interfaces/.solhint.json | 3 + .../rewards/ILegacyRewardsManager.sol | 1 - packages/interfaces/package.json | 19 +- packages/subgraph-service/.markdownlint.json | 3 + .../subgraph-service/natspec-smells.config.js | 11 - packages/subgraph-service/package.json | 32 +- packages/subgraph-service/tsconfig.json | 3 +- .../.graphclient-extracted/index.d.ts | 552 ++ .../.graphclient-extracted/index.js | 103 + packages/token-distribution/.solhint.json | 3 + packages/token-distribution/ops/info.ts | 4 +- packages/token-distribution/package.json | 29 +- packages/token-distribution/scripts/build.js | 67 +- .../scripts/extract-graphclient.js | 190 + packages/token-distribution/scripts/test | 2 +- packages/toolshed/.markdownlint.json | 3 + packages/toolshed/package.json | 17 +- .../src/deployments/horizon/address-book.ts | 6 +- pnpm-lock.yaml | 5433 +++++++---------- pnpm-workspace.yaml | 62 +- remappings.txt | 2 - scripts/calculate-storage-locations.js | 93 - scripts/check-todos.sh | 78 + scripts/filter-natspec.js | 62 - scripts/lint-staged-run.sh | 51 + scripts/utils/storage-locations.js | 101 - scripts/verify-solhint-disables.js | 299 + scripts/verify-storage-slots.js | 315 - tsconfig.json | 9 +- 65 files changed, 4222 insertions(+), 4159 deletions(-) delete mode 100644 natspec-smells.config.js create mode 100644 packages/address-book/.markdownlint.json create mode 100644 packages/contracts/.solhint.json create mode 100644 packages/contracts/task/prettier.config.cjs create mode 100644 packages/contracts/test/prettier.config.cjs create mode 100644 packages/data-edge/.solhint.json create mode 100644 packages/horizon/.markdownlint.json delete mode 100644 packages/horizon/natspec-smells.config.js create mode 100644 packages/interfaces/.solhint.json create mode 100644 packages/subgraph-service/.markdownlint.json delete mode 100644 packages/subgraph-service/natspec-smells.config.js create mode 100644 packages/token-distribution/.graphclient-extracted/index.d.ts create mode 100644 packages/token-distribution/.graphclient-extracted/index.js create mode 100644 packages/token-distribution/.solhint.json create mode 100644 packages/token-distribution/scripts/extract-graphclient.js create mode 100644 packages/toolshed/.markdownlint.json delete mode 100644 remappings.txt delete mode 100644 scripts/calculate-storage-locations.js create mode 100755 scripts/check-todos.sh delete mode 100755 scripts/filter-natspec.js create mode 100755 scripts/lint-staged-run.sh delete mode 100644 scripts/utils/storage-locations.js create mode 100755 scripts/verify-solhint-disables.js delete mode 100755 scripts/verify-storage-slots.js diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 3450ef3bd..3d9159478 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -26,10 +26,10 @@ jobs: run: pnpm -r --sequential run build - name: Test all packages - run: pnpm -r --sequential run test + run: pnpm -r --sequential run test:self - name: Test with coverage - run: pnpm -r --sequential run test:coverage + run: pnpm -r --sequential run test:coverage:self - name: Find coverage files id: coverage_files @@ -47,4 +47,4 @@ jobs: files: ${{ steps.coverage_files.outputs.files }} flags: unittests name: graphprotocol-contracts - fail_ci_if_error: true + fail_ci_if_error: false diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index db28bb954..7746988af 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -167,15 +167,6 @@ jobs: echo "sol_prettier_exit_code=0" >> $GITHUB_OUTPUT fi - - name: Lint Solidity files (Natspec Documentation) - id: lint_sol_natspec - continue-on-error: true - run: | - echo "Checking Solidity documentation with natspec-smells..." - # Run natspec-smells from root to check all configured packages - npx natspec-smells - echo "sol_natspec_exit_code=$?" >> $GITHUB_OUTPUT - - name: Lint Markdown files (Markdownlint) id: lint_md_markdownlint continue-on-error: true @@ -320,15 +311,6 @@ jobs: WARNINGS=$((WARNINGS+1)) fi - # Solidity - Natspec Documentation - if [ "$SOL_NATSPEC_EXIT_CODE" = "1" ]; then - echo "::error::natspec-smells found documentation issues in Solidity files" - ERRORS=$((ERRORS+1)) - elif [ "$SOL_NATSPEC_EXIT_CODE" != "0" ]; then - echo "::warning::natspec-smells found warnings in Solidity files" - WARNINGS=$((WARNINGS+1)) - fi - # Markdown - Markdownlint if [ "$MD_MARKDOWNLINT_EXIT_CODE" = "1" ]; then echo "::error::Markdownlint found errors in Markdown files" diff --git a/.gitignore b/.gitignore index 71e7cca5c..73a50607e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,7 @@ core.* # Dependency directories node_modules/ -forge-std/ -**/lib/forge-std/ +.pnpm-store/ # Yarn .yarn/* @@ -41,6 +40,8 @@ types-v5/ wagmi/ types/ deployments/hardhat/ +*.js.map +*.d.ts.map # TypeScript incremental compilation cache **/tsconfig.tsbuildinfo @@ -69,7 +70,6 @@ arbitrum-addresses-local.json addresses-fork.json addresses-hardhat.json addresses-local*.json -addresses-local-network.json # Keys .keystore @@ -78,7 +78,6 @@ addresses-local-network.json cache_forge forge-artifacts/ out/ -packages/issuance/lib/forge-std/ # Graph client .graphclient diff --git a/.markdownlint.json b/.markdownlint.json index 5b37d3bd4..1a6cd5315 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -1,9 +1,9 @@ { "default": true, + "MD004": { "style": "dash" }, + "MD007": { "indent": 2 }, "MD013": false, "MD024": { "siblings_only": true }, - "MD033": false, "MD029": { "style": "ordered" }, - "MD007": { "indent": 2 }, - "MD004": { "style": "dash" } + "MD033": false } diff --git a/.markdownlintignore b/.markdownlintignore index 07fda34db..b841adfce 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1,3 +1,7 @@ +# Autogenerated GraphClient files (committed but should not be linted) +**/.graphclient-extracted/ +**/.graphclient/ + # Dependencies node_modules/ @@ -30,10 +34,7 @@ lcov.info packages/*/.eslintcache deployments/hardhat/ .graphclient -**/chain-31337/ -**/chain-1377/ -**/horizon-localhost/ -**/horizon-hardhat/ -**/subgraph-service-localhost/ -**/subgraph-service-hardhat/ -.changeset/ \ No newline at end of file +**/chain-*/ +**/*-localhost/ +**/*-hardhat/ +.changeset/ diff --git a/.prettierignore b/.prettierignore index 5f437b921..7b5b8c984 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,7 +8,6 @@ node_modules/ # Third-party libraries in lib directories **/lib/ -forge-std/ # Build outputs (from .gitignore) **/build/ @@ -36,9 +35,7 @@ lcov.info packages/*/.eslintcache deployments/hardhat/ .graphclient -**/chain-31337/ -**/chain-1377/ -**/horizon-localhost/ -**/horizon-hardhat/ -**/subgraph-service-localhost/ -**/subgraph-service-hardhat/ +**/.graphclient-extracted/ +**/chain-*/ +**/*-localhost/ +**/*-hardhat/ diff --git a/README.md b/README.md index 3d14caecc..2fa5496a2 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,11 @@ This repository is a pnpm workspaces monorepo containing the following packages: | Package | Latest version | Description | | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | | [contracts](./packages/contracts) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fcontracts.svg)](https://badge.fury.io/js/@graphprotocol%2Fcontracts) | Contracts enabling the open and permissionless decentralized network known as The Graph protocol. | -| [data-edge](./packages/data-edge) | - | Data edge testing and utilities for The Graph protocol. | +| [data-edge](./packages/data-edge) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fdata-edge.svg)](https://badge.fury.io/js/@graphprotocol%2Fdata-edge) | Data edge testing and utilities for The Graph protocol. | | [hardhat-graph-protocol](./packages/hardhat-graph-protocol) | [![npm version](https://badge.fury.io/js/hardhat-graph-protocol.svg)](https://badge.fury.io/js/hardhat-graph-protocol) | A Hardhat plugin that extends the runtime environment with functionality for The Graph protocol. | | [horizon](./packages/horizon) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fhorizon.svg)](https://badge.fury.io/js/@graphprotocol%2Fhorizon) | Contracts for Graph Horizon, the next iteration of The Graph protocol. | | [interfaces](./packages/interfaces) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Finterfaces.svg)](https://badge.fury.io/js/@graphprotocol%2Finterfaces) | Contract interfaces for The Graph protocol contracts. | +| [issuance](./packages/issuance) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fissuance.svg)](https://badge.fury.io/js/@graphprotocol%2Fissuance) | Smart contracts for The Graph's token issuance functionality | | [subgraph-service](./packages/subgraph-service) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fsubgraph-service.svg)](https://badge.fury.io/js/@graphprotocol%2Fsubgraph-service) | Contracts for the Subgraph data service in Graph Horizon. | | [token-distribution](./packages/token-distribution) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Ftoken-distribution.svg)](https://badge.fury.io/js/@graphprotocol%2Ftoken-distribution) | Contracts managing token locks for network participants. | | [toolshed](./packages/toolshed) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Ftoolshed.svg)](https://badge.fury.io/js/@graphprotocol%2Ftoolshed) | A collection of tools and utilities for the Graph Protocol TypeScript components. | @@ -67,6 +68,52 @@ $ pnpm install # Build projects $ pnpm build + +# Run tests +$ pnpm test +``` + +### Script Patterns + +This monorepo follows consistent script patterns across all packages to ensure reliable builds and tests: + +#### Build Scripts + +- **`pnpm build`** (root) - Builds all packages by calling `build:self` on each +- **`pnpm build`** (package) - Builds dependencies first, then the package itself +- **`pnpm build:self`** - Builds only the current package (no dependencies) +- **`pnpm build:dep`** - Builds workspace dependencies needed by the current package + +#### Test Scripts + +- **`pnpm test`** (root) - Builds everything once, then runs `test:self` on all packages +- **`pnpm test`** (package) - Builds dependencies first, then runs tests +- **`pnpm test:self`** - Runs only the package's tests (no building) +- **`pnpm test:coverage`** (root) - Builds everything once, then runs `test:coverage:self` on all packages +- **`pnpm test:coverage`** (package) - Builds dependencies first, then runs coverage +- **`pnpm test:coverage:self`** - Runs only the package's coverage tests (no building) + +#### Key Benefits + +- **Efficiency**: Root `pnpm test` builds once, then tests all packages +- **Reliability**: Individual package tests always ensure dependencies are built +- **Consistency**: Same patterns work at any level (root or package) +- **Child Package Support**: Packages with child packages delegate testing appropriately + +#### Examples + +```bash +# Build everything from root +pnpm build + +# Test everything from root (builds once, tests all) +pnpm test + +# Test a specific package (builds its dependencies, then tests) +cd packages/horizon && pnpm test + +# Test without building (assumes dependencies already built) +cd packages/horizon && pnpm test:self ``` ### Versioning and publishing packages @@ -118,6 +165,158 @@ pnpm publish --recursive Alternatively, there is a GitHub action that can be manually triggered to publish a package. +## Linting Configuration + +This monorepo uses a comprehensive linting setup with multiple tools to ensure code quality and consistency across all packages. + +### Linting Tools Overview + +- **ESLint**: JavaScript/TypeScript code quality and style enforcement +- **Prettier**: Code formatting for JavaScript, TypeScript, JSON, Markdown, YAML, and Solidity +- **Solhint**: Solidity-specific linting for smart contracts +- **Markdownlint**: Markdown formatting and style consistency +- **YAML Lint**: YAML file validation and formatting + +### Configuration Architecture + +The linting configuration follows a hierarchical structure where packages inherit from root-level configurations: + +#### ESLint Configuration + +- **Root Configuration**: `eslint.config.mjs` - Modern flat config format +- **Direct Command**: `npx eslint '**/*.{js,ts,cjs,mjs,jsx,tsx}' --fix` +- **Behavior**: ESLint automatically searches up parent directories to find configuration files +- **Package Inheritance**: Packages automatically inherit the root ESLint configuration without needing local config files +- **Global Ignores**: Configured to exclude autogenerated files (`.graphclient-extracted/`, `lib/`) and build outputs + +#### Prettier Configuration + +- **Root Configuration**: `prettier.config.cjs` - Base formatting rules for all file types +- **Direct Command**: `npx prettier -w --cache '**/*.{js,ts,cjs,mjs,jsx,tsx,json,md,sol,yml,yaml}'` +- **Package Inheritance**: Packages that need Prettier must have a `prettier.config.cjs` file that inherits from the shared config +- **Example Package Config**: + + ```javascript + const baseConfig = require('../../prettier.config.cjs') + module.exports = { ...baseConfig } + ``` + +- **Ignore Files**: `.prettierignore` excludes lock files, build outputs, and third-party dependencies + +#### Solidity Linting (Solhint) + +- **Root Configuration**: `.solhint.json` - Base Solidity linting rules extending `solhint:recommended` +- **Direct Command**: `npx solhint 'contracts/**/*.sol'` (add `--fix` for auto-fixing) +- **List Applied Rules**: `npx solhint list-rules` +- **TODO Comment Checking**: `scripts/check-todos.sh` - Blocks commits and linting if TODO/FIXME/XXX/HACK comments are found in changed Solidity files +- **Package Inheritance**: Packages can extend the root config with package-specific rules +- **Configuration Inheritance Limitation**: Solhint has a limitation where nested `extends` don't work properly. When a local config extends a parent config that itself extends `solhint:recommended`, the built-in ruleset is ignored. +- **Recommended Package Extension Pattern**: + + ```json + { + "extends": ["solhint:recommended", "./../../.solhint.json"], + "rules": { + "no-console": "off", + "import-path-check": "off" + } + } + ``` + +#### Markdown Linting (Markdownlint) + +- **Root Configuration**: `.markdownlint.json` - Markdown formatting and style rules +- **Direct Command**: `npx markdownlint '**/*.md' --fix` +- **Ignore Files**: `.markdownlintignore` automatically picked up by markdownlint CLI +- **Global Application**: Applied to all markdown files across the monorepo + +### Linting Scripts + +#### Root Level Scripts + +```bash +# Run all linting tools +pnpm lint + +# Individual linting commands +pnpm lint:ts # ESLint + Prettier for TypeScript/JavaScript +pnpm lint:sol # TODO check + Solhint + Prettier for Solidity (runs recursively) +pnpm lint:md # Markdownlint + Prettier for Markdown +pnpm lint:json # Prettier for JSON files +pnpm lint:yaml # YAML linting + Prettier + +# Lint only staged files (useful for manual pre-commit checks) +pnpm lint:staged # Run linting on git-staged files only +``` + +#### Package Level Scripts + +Each package can define its own linting scripts that work with the inherited configurations: + +```bash +# Example from packages/contracts +pnpm lint:sol # Solhint for contracts in this package only +pnpm lint:ts # ESLint for TypeScript files in this package +``` + +### Pre-commit Hooks (lint-staged) + +The repository uses `lint-staged` with Husky to run linting on staged files before commits: + +- **Automatic**: Runs automatically on `git commit` via Husky pre-commit hook +- **Manual**: Run `pnpm lint:staged` to manually check staged files before committing +- **Configuration**: Root `package.json` contains lint-staged configuration +- **Custom Script**: `scripts/lint-staged-run.sh` filters out generated files that shouldn't be linted +- **File Type Handling**: + - `.{js,ts,cjs,mjs,jsx,tsx}`: ESLint + Prettier + - `.sol`: TODO check + Solhint + Prettier + - `.md`: Markdownlint + Prettier + - `.json`: Prettier only + - `.{yml,yaml}`: YAML lint + Prettier + +**Usage**: `pnpm lint:staged` is particularly useful when you want to check what linting changes will be applied to your staged files before actually committing. + +### TODO Comment Enforcement + +The repository enforces TODO comment resolution to maintain code quality: + +- **Scope**: Applies only to Solidity (`.sol`) files +- **Detection**: Finds TODO, FIXME, XXX, and HACK comments (case-insensitive) +- **Triggers**: + - **Pre-commit**: Blocks commits if TODO comments exist in files being committed + - **Regular linting**: Flags TODO comments in locally changed, staged, or untracked Solidity files +- **Script**: `scripts/check-todos.sh` (must be run from repository root) +- **Bypass**: Use `git commit --no-verify` to bypass (not recommended for production) + +### Key Design Principles + +1. **Hierarchical Configuration**: Root configurations provide base rules, packages can extend as needed +2. **Tool-Specific Inheritance**: ESLint searches up automatically, Prettier requires explicit inheritance +3. **Generated File Exclusion**: Multiple layers of exclusion for autogenerated content +4. **Consistent Formatting**: Prettier ensures consistent code formatting across all file types +5. **Fail-Fast Linting**: Pre-commit hooks catch issues before they enter the repository + +### Configuration Files Reference + +| Tool | Root Config | Package Config | Ignore Files | +| ------------ | --------------------- | -------------------------------- | ---------------------------- | +| ESLint | `eslint.config.mjs` | Auto-inherited | Built into config | +| Prettier | `prettier.config.cjs` | `prettier.config.cjs` (inherits) | `.prettierignore` | +| Solhint | `.solhint.json` | `.solhint.json` (array extends) | N/A | +| Markdownlint | `.markdownlint.json` | Auto-inherited | `.markdownlintignore` | +| Lint-staged | `package.json` | N/A | `scripts/lint-staged-run.sh` | + +### Troubleshooting + +- **ESLint not finding config**: ESLint searches up parent directories automatically - no local config needed +- **Prettier not working**: Packages need a `prettier.config.cjs` that inherits from root config +- **Solhint missing rules**: If extending a parent config, use array format: `["solhint:recommended", "./../../.solhint.json"]` to ensure all rules are loaded +- **Solhint inheritance not working**: Nested extends don't work - parent config's `solhint:recommended` won't be inherited with simple string extends +- **Solhint rule reference**: Use `npx solhint list-rules` to see all available rules and their descriptions +- **Generated files being linted**: Check ignore patterns in `.prettierignore`, `.markdownlintignore`, and ESLint config +- **Preview lint changes before commit**: Use `pnpm lint:staged` to see what changes will be applied to staged files +- **Commit blocked by linting**: Fix the linting issues or use `git commit --no-verify` to bypass (not recommended) + ## Documentation > Coming soon diff --git a/eslint.config.mjs b/eslint.config.mjs index 391318794..99a7916fb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,7 +10,6 @@ import eslint from '@eslint/js' import typescriptPlugin from '@typescript-eslint/eslint-plugin' import prettier from 'eslint-config-prettier' import importPlugin from 'eslint-plugin-import' -import jsdocPlugin from 'eslint-plugin-jsdoc' import noOnlyTests from 'eslint-plugin-no-only-tests' import simpleImportSort from 'eslint-plugin-simple-import-sort' import unusedImportsPlugin from 'eslint-plugin-unused-imports' @@ -155,28 +154,6 @@ const eslintConfig = [ }, rules: { 'unused-imports/no-unused-imports': 'warn', - 'unused-imports/no-unused-vars': [ - 'warn', - { - vars: 'all', - varsIgnorePattern: '^_', - args: 'after-used', - argsIgnorePattern: '^_', - }, - ], - }, - }, - - // JSDoc plugin configuration - { - plugins: { - jsdoc: jsdocPlugin, - }, - rules: { - 'jsdoc/require-jsdoc': 'off', - 'jsdoc/require-param': 'off', - 'jsdoc/require-returns': 'off', - 'jsdoc/require-description': 'off', }, }, diff --git a/natspec-smells.config.js b/natspec-smells.config.js deleted file mode 100644 index e0299002b..000000000 --- a/natspec-smells.config.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @title natspec-smells configuration for The Graph Protocol contracts - * @notice Configuration for natspec-smells linter to ensure consistent and complete - * documentation across all Solidity contracts in the monorepo. - * - * This configuration is based on the horizon config from the main contracts repository - * for consistency across The Graph Protocol ecosystem. - * - * List of supported options: https://github.com/defi-wonderland/natspec-smells?tab=readme-ov-file#options - */ - -/** @type {import('@defi-wonderland/natspec-smells').Config} */ -module.exports = { - include: [ - 'packages/issuance/contracts/**/*.sol', - 'packages/interfaces/contracts/**/*.sol', - 'packages/horizon/contracts/**/*.sol', - 'packages/subgraph-service/contracts/**/*.sol', - ], - - root: './', - - // Disable @inheritdoc enforcement to avoid issues with storage getters and non-interface functions - enforceInheritdoc: false, - - constructorNatspec: true, -} diff --git a/package.json b/package.json index ca08c43a9..bff9f5bbd 100644 --- a/package.json +++ b/package.json @@ -4,60 +4,50 @@ "description": "Contracts monorepo for The Graph protocol", "license": "GPL-2.0-or-later", "repository": "git@github.com:graphprotocol/contracts.git", - "author": "The Graph team", + "author": "Edge & Node", "packageManager": "pnpm@10.17.0", "scripts": { "postinstall": "husky", "clean": "pnpm -r run clean", "clean:all": "pnpm clean && rm -rf node_modules packages/*/node_modules packages/*/*/node_modules", - "build": "pnpm -r run build", - "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:natspec; pnpm lint:md; pnpm lint:json; pnpm lint:yaml", + "build": "pnpm -r run build:self", + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json; pnpm lint:yaml", + "lint:staged": "lint-staged", "lint:ts": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", - "lint:sol": "solhint --fix --noPrompt --noPoster 'packages/*/contracts/**/*.sol'; prettier -w --cache --log-level warn '**/*.sol'", - "lint:natspec": "node scripts/filter-natspec.js", - "lint:md": "markdownlint --fix --ignore-path .gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", + "lint:sol": "scripts/check-todos.sh; pnpm -r run lint:sol; prettier -w --cache --log-level warn '**/*.sol'", + "lint:md": "markdownlint --fix --ignore-path .gitignore --ignore-path .markdownlintignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "lint:yaml": "npx yaml-lint .github/**/*.{yml,yaml} packages/contracts/task/config/*.yml; prettier -w --cache --log-level warn '**/*.{yml,yaml}'", "format": "prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx,json,md,yaml,yml}'", - "test": "pnpm -r run test", - "test:coverage": "pnpm -r run test:coverage" + "test": "pnpm build && pnpm -r run test:self", + "test:coverage": "pnpm build && pnpm -r run test:coverage:self" }, "devDependencies": { - "@changesets/cli": "^2.27.1", - "@commitlint/cli": "19.8.1", - "@commitlint/config-conventional": "19.8.1", - "@defi-wonderland/natspec-smells": "^1.1.6", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.28.0", - "@openzeppelin/contracts": "^5.3.0", - "@openzeppelin/contracts-upgradeable": "^5.3.0", - "@typescript-eslint/eslint-plugin": "^8.33.1", - "@typescript-eslint/parser": "^8.33.1", - "eslint": "^9.28.0", - "eslint-config-prettier": "^10.1.5", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsdoc": "^50.6.17", - "eslint-plugin-markdown": "^5.1.0", - "eslint-plugin-no-only-tests": "^3.3.0", - "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-unused-imports": "^4.1.4", - "globals": "^16.1.0", - "husky": "^9.1.7", - "lint-staged": "^16.0.0", - "markdownlint-cli": "^0.45.0", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^1.0.0", - "pretty-quick": "^4.1.1", - "solhint": "^5.1.0", - "typescript": "^5.8.3", - "typescript-eslint": "^8.33.1", - "yaml-lint": "^1.7.0" + "@changesets/cli": "catalog:", + "@commitlint/cli": "catalog:", + "@commitlint/config-conventional": "catalog:", + "@eslint/js": "catalog:", + "@typescript-eslint/eslint-plugin": "catalog:", + "@typescript-eslint/parser": "catalog:", + "eslint": "catalog:", + "eslint-config-prettier": "catalog:", + "eslint-plugin-import": "catalog:", + "eslint-plugin-no-only-tests": "catalog:", + "eslint-plugin-simple-import-sort": "catalog:", + "eslint-plugin-unused-imports": "catalog:", + "globals": "catalog:", + "husky": "catalog:", + "lint-staged": "catalog:", + "markdownlint-cli": "catalog:", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", + "typescript": "catalog:", + "typescript-eslint": "catalog:", + "yaml-lint": "catalog:" }, "pnpm": { "overrides": { - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "typescript": "^5.8.3", "@types/node": "^20.17.50" }, "patchedDependencies": { @@ -66,10 +56,11 @@ }, "lint-staged": { "*.{js,ts,cjs,mjs,jsx,tsx}": [ - "eslint --fix --cache", - "prettier -w --cache --log-level warn" + "scripts/lint-staged-run.sh 'eslint --fix --cache'", + "scripts/lint-staged-run.sh 'prettier -w --cache --log-level warn'" ], "*.sol": [ + "scripts/check-todos.sh", "solhint --fix --noPrompt --noPoster", "prettier -w --cache --log-level warn" ], diff --git a/packages/address-book/.markdownlint.json b/packages/address-book/.markdownlint.json new file mode 100644 index 000000000..18947b0be --- /dev/null +++ b/packages/address-book/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.markdownlint.json" +} diff --git a/packages/address-book/package.json b/packages/address-book/package.json index 601b14dd0..6336e025e 100644 --- a/packages/address-book/package.json +++ b/packages/address-book/package.json @@ -16,13 +16,15 @@ "README.md" ], "scripts": { - "lint": "prettier -w --cache --log-level warn '**/*.json'", + "lint": "pnpm lint:md; pnpm lint:json", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", + "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "restore-symlinks": "node scripts/restore-symlinks.js", "prepublishOnly": "node scripts/copy-addresses-for-publish.js", "postpublish": "node scripts/restore-symlinks.js" }, "devDependencies": { - "prettier": "^3.0.0" + "prettier": "catalog:" }, "keywords": [ "ethereum", diff --git a/packages/contracts/.solhint.json b/packages/contracts/.solhint.json new file mode 100644 index 000000000..d30847305 --- /dev/null +++ b/packages/contracts/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": ["solhint:recommended", "./../../.solhint.json"] +} diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 169d05e42..090757e8a 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -29,8 +29,10 @@ "scripts": { "prepack": "pnpm build", "clean": "rm -rf artifacts/ cache/ types/ abis/ build/ dist/", - "build": "pnpm compile", + "build": "pnpm build:self", + "build:self": "pnpm compile", "compile": "hardhat compile", + "test": "pnpm --filter @graphprotocol/contracts-tests test", "deploy": "pnpm predeploy && pnpm build", "deploy-localhost": "pnpm build", "predeploy": "scripts/predeploy", @@ -55,6 +57,7 @@ "@ethersproject/bytes": "^5.8.0", "@ethersproject/providers": "^5.8.0", "@graphprotocol/common-ts": "^1.8.3", + "@graphprotocol/interfaces": "workspace:^", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.0", @@ -71,26 +74,25 @@ "arbos-precompiles": "^1.0.2", "chai": "^4.2.0", "dotenv": "^16.5.0", - "eslint": "^9.28.0", + "eslint": "catalog:", "ethereum-waffle": "^4.0.10", - "ethers": "^5.7.0", + "ethers": "^5.7.2", "form-data": "^4.0.0", - "glob": "^8.0.3", + "glob": "catalog:", "graphql": "^16.11.0", "graphql-tag": "^2.12.4", - "hardhat": "^2.24.0", + "hardhat": "catalog:", "hardhat-abi-exporter": "^2.11.0", - "hardhat-contract-sizer": "^2.10.0", - "hardhat-gas-reporter": "^1.0.8", - "hardhat-secure-accounts": "0.0.6", - "hardhat-storage-layout": "^0.1.7", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "solhint": "^5.1.0", + "hardhat-contract-sizer": "catalog:", + "hardhat-gas-reporter": "catalog:", + "hardhat-storage-layout": "catalog:", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", "solidity-coverage": "^0.8.16", "ts-node": "^10.9.2", "typechain": "^8.3.2", - "typescript": "^5.8.3", + "typescript": "catalog:", "winston": "^3.3.3", "yaml": "^1.10.2", "yargs": "^17.0.0" diff --git a/packages/contracts/task/package.json b/packages/contracts/task/package.json index ac4f47b21..c45cc594a 100644 --- a/packages/contracts/task/package.json +++ b/packages/contracts/task/package.json @@ -37,27 +37,25 @@ "@types/node": "^20.17.50", "arbos-precompiles": "^1.0.2", "dotenv": "^16.5.0", - "eslint": "^9.28.0", + "eslint": "catalog:", "ethers": "^5.7.0", "form-data": "^4.0.0", - "glob": "^8.0.3", + "glob": "catalog:", "graphql": "^16.11.0", "graphql-tag": "^2.12.4", - "hardhat": "^2.24.0", + "hardhat": "catalog:", "hardhat-abi-exporter": "^2.11.0", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.8", - "hardhat-secure-accounts": "0.0.6", "hardhat-storage-layout": "^0.1.7", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "solhint": "^5.1.0", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", "ts-node": "^10.9.2", "typechain": "^8.3.2", - "typescript": "^5.8.3", + "typescript": "catalog:", "winston": "^3.3.3", "yaml": "^1.10.2", - "yaml-lint": "^1.7.0", + "yaml-lint": "catalog:", "yargs": "^17.0.0" }, "scripts": { diff --git a/packages/contracts/task/prettier.config.cjs b/packages/contracts/task/prettier.config.cjs new file mode 100644 index 000000000..8eb0a0bee --- /dev/null +++ b/packages/contracts/task/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/contracts/task/tsconfig.json b/packages/contracts/task/tsconfig.json index f866f8173..f60d075ba 100644 --- a/packages/contracts/task/tsconfig.json +++ b/packages/contracts/task/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "rootDir": ".", + "rootDir": "..", "outDir": "./build", "declarationDir": "./types" }, diff --git a/packages/contracts/test/hardhat.config.ts b/packages/contracts/test/hardhat.config.ts index ea2b0ca1b..50436de00 100644 --- a/packages/contracts/test/hardhat.config.ts +++ b/packages/contracts/test/hardhat.config.ts @@ -39,6 +39,7 @@ const config: HardhatUserConfig = { tests: './tests/unit', cache: './cache', graph: '..', + artifacts: './artifacts', }, typechain: { outDir: 'types', diff --git a/packages/contracts/test/package.json b/packages/contracts/test/package.json index 910a8da9a..2deffeef2 100644 --- a/packages/contracts/test/package.json +++ b/packages/contracts/test/package.json @@ -32,26 +32,24 @@ "arbos-precompiles": "^1.0.2", "chai": "^4.2.0", "dotenv": "^16.5.0", - "eslint": "^9.28.0", + "eslint": "catalog:", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.0", "form-data": "^4.0.0", - "glob": "^8.0.3", + "glob": "catalog:", "graphql": "^16.11.0", "graphql-tag": "^2.12.4", - "hardhat": "^2.24.0", + "hardhat": "catalog:", "hardhat-abi-exporter": "^2.11.0", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.8", - "hardhat-secure-accounts": "0.0.6", "hardhat-storage-layout": "^0.1.7", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "solhint": "^5.1.0", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", "solidity-coverage": "^0.8.16", "ts-node": "^10.9.2", "typechain": "^8.3.2", - "typescript": "^5.8.3", + "typescript": "catalog:", "winston": "^3.3.3", "yaml": "^1.10.2", "yargs": "^17.0.0" @@ -59,10 +57,14 @@ "scripts": { "postinstall": "scripts/setup-symlinks", "clean": "rm -rf artifacts/ cache/ reports/ types/", - "test": "scripts/test", + "build": "pnpm build:dep", + "build:dep": "pnpm --filter '@graphprotocol/contracts-tests^...' run build:self", + "test": "pnpm build && pnpm test:self", + "test:self": "scripts/test", "test:e2e": "scripts/e2e", "test:gas": "RUN_EVM=true REPORT_GAS=true scripts/test", - "test:coverage": "scripts/coverage", + "test:coverage": "pnpm build && pnpm test:coverage:self", + "test:coverage:self": "scripts/coverage", "test:upgrade": "scripts/upgrade", "lint": "pnpm lint:ts; pnpm lint:json", "lint:ts": "eslint '**/*.{js,ts,cjs,mjs,jsx,tsx}' --fix --cache; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", diff --git a/packages/contracts/test/prettier.config.cjs b/packages/contracts/test/prettier.config.cjs new file mode 100644 index 000000000..8eb0a0bee --- /dev/null +++ b/packages/contracts/test/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/contracts/test/scripts/coverage b/packages/contracts/test/scripts/coverage index 6a08095ab..bede10274 100755 --- a/packages/contracts/test/scripts/coverage +++ b/packages/contracts/test/scripts/coverage @@ -2,8 +2,6 @@ set -eo pipefail -pnpm --filter @graphprotocol/contracts --filter @graphprotocol/sdk build - echo {} > addresses-local.json DISABLE_SECURE_ACCOUNTS=true \ diff --git a/packages/contracts/test/scripts/test b/packages/contracts/test/scripts/test index 1d9983bdb..24a9324c4 100755 --- a/packages/contracts/test/scripts/test +++ b/packages/contracts/test/scripts/test @@ -5,9 +5,7 @@ source $(pwd)/scripts/evm ### Setup EVM -# Ensure we compiled sources and dependencies - -pnpm --filter @graphprotocol/contracts build +# Ensure we compiled sources and dependencies (build should be done by caller) ### Cleanup function cleanup() { diff --git a/packages/contracts/test/tests/unit/governance/governed.test.ts b/packages/contracts/test/tests/unit/governance/governed.test.ts index 4a9f66ca6..0fd617b1e 100644 --- a/packages/contracts/test/tests/unit/governance/governed.test.ts +++ b/packages/contracts/test/tests/unit/governance/governed.test.ts @@ -8,7 +8,7 @@ import hre from 'hardhat' const { ethers } = hre const { AddressZero } = ethers.constants -describe.skip('Governed', () => { +describe('Governed', () => { const graph = hre.graph() let me: SignerWithAddress let governor: SignerWithAddress @@ -18,7 +18,7 @@ describe.skip('Governed', () => { beforeEach(async function () { ;[me, governor] = await graph.getTestAccounts() - const factory = await ethers.getContractFactory('GovernedMock') + const factory = await ethers.getContractFactory('contracts/tests/GovernedMock.sol:GovernedMock') governed = (await factory.connect(governor).deploy()) as Governed }) diff --git a/packages/contracts/test/tests/unit/l2/l2GraphTokenGateway.test.ts b/packages/contracts/test/tests/unit/l2/l2GraphTokenGateway.test.ts index f69589355..b4bb7bcf4 100644 --- a/packages/contracts/test/tests/unit/l2/l2GraphTokenGateway.test.ts +++ b/packages/contracts/test/tests/unit/l2/l2GraphTokenGateway.test.ts @@ -86,15 +86,10 @@ describe('L2GraphTokenGateway', () => { process.env.npm_lifecycle_event === 'test:coverage' if (!isRunningUnderCoverage) { - try { - arbSysMock = await smock.fake('IArbSys', { - address: '0x0000000000000000000000000000000000000064', - }) - arbSysMock.sendTxToL1.returns(1) - } catch { - // Skip smock setup if IArbSys artifact is not found - console.log('Skipping ArbSys mock setup due to artifact not found') - } + arbSysMock = await smock.fake('ArbSys', { + address: '0x0000000000000000000000000000000000000064', + }) + arbSysMock.sendTxToL1.returns(1) } }) @@ -275,7 +270,7 @@ describe('L2GraphTokenGateway', () => { ](tokenSender.address, l1Receiver.address, toGRT('10'), defaultData) await expect(tx).revertedWith('TOKEN_NOT_GRT') }) - it.skip('burns tokens and triggers an L1 call', async function () { + it('burns tokens and triggers an L1 call', async function () { // Check if we're running under coverage const isRunningUnderCoverage = hre.network.name === 'coverage' || @@ -291,7 +286,7 @@ describe('L2GraphTokenGateway', () => { await grt.connect(tokenSender).approve(l2GraphTokenGateway.address, toGRT('10')) await testValidOutboundTransfer(tokenSender, defaultData) }) - it.skip('decodes the sender address from messages sent by the router', async function () { + it('decodes the sender address from messages sent by the router', async function () { // Check if we're running under coverage const isRunningUnderCoverage = hre.network.name === 'coverage' || diff --git a/packages/contracts/test/tests/unit/lib/fixtures.ts b/packages/contracts/test/tests/unit/lib/fixtures.ts index 0c9dc3843..23e60c593 100644 --- a/packages/contracts/test/tests/unit/lib/fixtures.ts +++ b/packages/contracts/test/tests/unit/lib/fixtures.ts @@ -71,8 +71,8 @@ export class NetworkFixture { constructor(public provider: providers.Provider) {} async load(deployer: SignerWithAddress, l2Deploy?: boolean): Promise { - // Use instrumented artifacts when running coverage tests - const artifactsDir = process.env.SOLIDITY_COVERAGE ? './artifacts' : undefined + // Use instrumented artifacts when running coverage tests, otherwise use local artifacts + const artifactsDir = process.env.SOLIDITY_COVERAGE ? './artifacts' : '../artifacts' const contracts = await deployGraphNetwork( 'addresses-local.json', diff --git a/packages/contracts/test/tests/unit/rewards/rewards.test.ts b/packages/contracts/test/tests/unit/rewards/rewards.test.ts index 3fdd55d8a..84f836681 100644 --- a/packages/contracts/test/tests/unit/rewards/rewards.test.ts +++ b/packages/contracts/test/tests/unit/rewards/rewards.test.ts @@ -1,3 +1,8 @@ +import { Curation } from '@graphprotocol/contracts' +import { EpochManager } from '@graphprotocol/contracts' +import { GraphToken } from '@graphprotocol/contracts' +import { IStaking } from '@graphprotocol/contracts' +import { RewardsManager } from '@graphprotocol/contracts' import { deriveChannelKey, formatGRT, @@ -13,11 +18,6 @@ import { expect } from 'chai' import { BigNumber, constants } from 'ethers' import hre from 'hardhat' -import { Curation } from '../../../build/types/Curation' -import { EpochManager } from '../../../build/types/EpochManager' -import { GraphToken } from '../../../build/types/GraphToken' -import { IStaking } from '../../../build/types/IStaking' -import { RewardsManager } from '../../../build/types/RewardsManager' import { NetworkFixture } from '../lib/fixtures' const MAX_PPM = 1000000 @@ -162,6 +162,14 @@ describe('Rewards', () => { }) describe('configuration', function () { + describe('initialize', function () { + it('should revert when called on implementation contract', async function () { + // Try to call initialize on the implementation contract (should revert with onlyImpl) + const tx = rewardsManager.connect(governor).initialize(contracts.Controller.address) + await expect(tx).revertedWith('Only implementation') + }) + }) + describe('issuance per block update', function () { it('reject set issuance per block if unauthorized', async function () { const tx = rewardsManager.connect(indexer1).setIssuancePerBlock(toGRT('1.025')) @@ -182,6 +190,82 @@ describe('Rewards', () => { }) }) + describe.skip('rewards eligibility oracle', function () { + it('should reject setRewardsEligibilityOracle if unauthorized', async function () { + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', + ) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) + await mockOracle.deployed() + const tx = rewardsManager.connect(indexer1).setRewardsEligibilityOracle(mockOracle.address) + await expect(tx).revertedWith('Only Controller governor') + }) + + it('should set rewards eligibility oracle if governor', async function () { + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', + ) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) + await mockOracle.deployed() + + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + await expect(tx) + .emit(rewardsManager, 'RewardsEligibilityOracleSet') + .withArgs(constants.AddressZero, mockOracle.address) + + expect(await rewardsManager.rewardsEligibilityOracle()).eq(mockOracle.address) + }) + + it('should allow setting rewards eligibility oracle to zero address', async function () { + // First set an oracle + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', + ) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) + await mockOracle.deployed() + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + + // Then set to zero address to disable + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(constants.AddressZero) + await expect(tx) + .emit(rewardsManager, 'RewardsEligibilityOracleSet') + .withArgs(mockOracle.address, constants.AddressZero) + + expect(await rewardsManager.rewardsEligibilityOracle()).eq(constants.AddressZero) + }) + + it('should reject setting oracle that does not support interface', async function () { + // Try to set an EOA (externally owned account) as the rewards eligibility oracle + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(indexer1.address) + await expect(tx).revertedWith('function call to a non-contract account') + }) + + it('should reject setting oracle that does not support IRewardsEligibilityOracle interface', async function () { + // Deploy a contract that doesn't support the IRewardsEligibilityOracle interface + const MockERC165OnlyContractFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockERC165OnlyContract.sol:MockERC165OnlyContract', + ) + const mockContract = await MockERC165OnlyContractFactory.deploy() + await mockContract.deployed() + + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(mockContract.address) + await expect(tx).revertedWith('Contract does not support IRewardsEligibilityOracle interface') + }) + + it('should not emit event when setting same oracle address', async function () { + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', + ) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) + await mockOracle.deployed() + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + + // Setting the same oracle again should not emit an event + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + await expect(tx).to.not.emit(rewardsManager, 'RewardsEligibilityOracleSet') + }) + }) + describe('subgraph availability service', function () { it('reject set subgraph oracle if unauthorized', async function () { const tx = rewardsManager.connect(indexer1).setSubgraphAvailabilityOracle(oracle.address) @@ -808,6 +892,96 @@ describe('Rewards', () => { const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) await expect(tx).emit(rewardsManager, 'RewardsDenied').withArgs(indexer1.address, allocationID1) }) + + it.skip('should deny rewards due to rewards eligibility oracle', async function () { + // Setup rewards eligibility oracle that denies rewards for indexer1 + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', + ) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(false) // Default to deny + await mockOracle.deployed() + + // Set the rewards eligibility oracle + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + + // Align with the epoch boundary + await helpers.mineEpoch(epochManager) + + // Setup allocation + await setupIndexerAllocation() + + // Jump to next epoch + await helpers.mineEpoch(epochManager) + + // Calculate expected rewards (for verification in the event) + const expectedIndexingRewards = toGRT('1400') + + // Close allocation. At this point rewards should be denied due to eligibility + const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) + await expect(tx) + .emit(rewardsManager, 'RewardsDeniedDueToEligibility') + .withArgs(indexer1.address, allocationID1, expectedIndexingRewards) + }) + + it.skip('should allow rewards when rewards eligibility oracle approves', async function () { + // Setup rewards eligibility oracle that allows rewards for indexer1 + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', + ) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) // Default to allow + await mockOracle.deployed() + + // Set the rewards eligibility oracle + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + + // Align with the epoch boundary + await helpers.mineEpoch(epochManager) + + // Setup allocation + await setupIndexerAllocation() + + // Jump to next epoch + await helpers.mineEpoch(epochManager) + + // Calculate expected rewards + const expectedIndexingRewards = toGRT('1400') + + // Close allocation. At this point rewards should be assigned normally + const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) + await expect(tx) + .emit(rewardsManager, 'HorizonRewardsAssigned') + .withArgs(indexer1.address, allocationID1, expectedIndexingRewards) + }) + + it('should handle zero rewards scenario correctly', async function () { + // Setup allocation with zero issuance to create zero rewards scenario + await rewardsManager.connect(governor).setIssuancePerBlock(0) + + // Align with the epoch boundary + await helpers.mineEpoch(epochManager) + + // Setup allocation + await setupIndexerAllocation() + + // Jump to next epoch + await helpers.mineEpoch(epochManager) + + // Before state + const beforeTokenSupply = await grt.totalSupply() + const beforeStakingBalance = await grt.balanceOf(staking.address) + + // Close allocation. At this point rewards should be zero + const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) + await expect(tx).emit(rewardsManager, 'HorizonRewardsAssigned').withArgs(indexer1.address, allocationID1, 0) + + // After state - should be unchanged since no rewards were minted + const afterTokenSupply = await grt.totalSupply() + const afterStakingBalance = await grt.balanceOf(staking.address) + + // Check that no tokens were minted (rewards were 0) + expect(afterTokenSupply).eq(beforeTokenSupply) + expect(afterStakingBalance).eq(beforeStakingBalance) + }) }) }) diff --git a/packages/contracts/test/tests/unit/staking/configuration.test.ts b/packages/contracts/test/tests/unit/staking/configuration.test.ts index 0ae33eafb..693e8648a 100644 --- a/packages/contracts/test/tests/unit/staking/configuration.test.ts +++ b/packages/contracts/test/tests/unit/staking/configuration.test.ts @@ -13,7 +13,7 @@ const { AddressZero } = constants const MAX_PPM = toBN('1000000') -describe.skip('Staking:Config', () => { +describe('Staking:Config', () => { const graph = hre.graph() let me: SignerWithAddress @@ -197,10 +197,10 @@ describe.skip('Staking:Config', () => { }) describe('Staking and StakingExtension', function () { - it.skip('does not allow calling the fallback from the Staking implementation', async function () { + it('does not allow calling the fallback from the Staking implementation', async function () { const impl = await proxyAdmin.getProxyImplementation(staking.address) - const factory = await ethers.getContractFactory('StakingExtension') + const factory = await ethers.getContractFactory('contracts/staking/StakingExtension.sol:StakingExtension') const implAsStaking = factory.attach(impl) as IStaking const tx = implAsStaking.connect(other).setDelegationRatio(50) await expect(tx).revertedWith('only through proxy') diff --git a/packages/data-edge/.solhint.json b/packages/data-edge/.solhint.json new file mode 100644 index 000000000..d30847305 --- /dev/null +++ b/packages/data-edge/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": ["solhint:recommended", "./../../.solhint.json"] +} diff --git a/packages/data-edge/package.json b/packages/data-edge/package.json index 2152f0899..d89a4f597 100644 --- a/packages/data-edge/package.json +++ b/packages/data-edge/package.json @@ -7,12 +7,15 @@ "scripts": { "prepare": "cd ../.. && husky install packages/contracts/.husky", "prepublishOnly": "scripts/prepublish", - "build": "scripts/build", + "build": "pnpm build:self", + "build:self": "scripts/build", "clean": "rm -rf build/ cache/ dist/ reports/ artifacts/", "compile": "hardhat compile", - "test": "scripts/test", + "test": "pnpm build && pnpm test:self", + "test:self": "scripts/test", "test:gas": "RUN_EVM=true REPORT_GAS=true scripts/test", - "test:coverage": "scripts/coverage", + "test:coverage": "pnpm build && pnpm test:coverage:self", + "test:coverage:self": "scripts/coverage", "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json", "lint:ts": "eslint '**/*.{js,ts,cjs,mjs,jsx,tsx}' --fix --cache; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", "lint:sol": "solhint --fix --noPrompt --noPoster 'contracts/**/*.sol'; prettier -w --cache --log-level warn 'contracts/**/*.sol'", @@ -35,8 +38,6 @@ "author": "The Graph Team", "license": "GPL-2.0-or-later", "devDependencies": { - "@commitlint/cli": "^16.2.1", - "@commitlint/config-conventional": "^16.2.1", "@ethersproject/abi": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/providers": "^5.7.0", @@ -54,11 +55,11 @@ "@types/sinon-chai": "^3.2.12", "chai": "^4.2.0", "dotenv": "^16.0.0", - "eslint": "^9.28.0", + "eslint": "catalog:", "ethereum-waffle": "^3.0.2", - "ethers": "^5.7.0", + "ethers": "^5.7.2", "ethlint": "^1.2.5", - "hardhat": "^2.24.0", + "hardhat": "catalog:", "hardhat-abi-exporter": "^2.2.0", "hardhat-contract-sizer": "^2.0.3", "hardhat-gas-reporter": "^1.0.4", @@ -67,13 +68,13 @@ "lint-staged": "^12.3.5", "lodash": "^4.17.21", "markdownlint-cli": "0.45.0", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^1.0.0-alpha.56", - "solhint": "^5.1.0", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", "solidity-coverage": "^0.8.16", "truffle-flattener": "^1.4.4", "ts-node": ">=8.0.0", "typechain": "^8.3.0", - "typescript": "^5.8.3" + "typescript": "catalog:" } } diff --git a/packages/data-edge/scripts/test b/packages/data-edge/scripts/test index 45ccd4b41..802e488b3 100755 --- a/packages/data-edge/scripts/test +++ b/packages/data-edge/scripts/test @@ -25,9 +25,7 @@ evm_kill() { ### Setup EVM -# Ensure we compiled sources - -pnpm build +# Ensure we compiled sources (build should be done by caller) # Gas reporter needs to run in its own evm instance if [ "$RUN_EVM" = true ]; then diff --git a/packages/hardhat-graph-protocol/README.md b/packages/hardhat-graph-protocol/README.md index 111a70c22..0c0302b3e 100644 --- a/packages/hardhat-graph-protocol/README.md +++ b/packages/hardhat-graph-protocol/README.md @@ -2,7 +2,7 @@ A Hardhat plugin for integrating with The Graph Protocol, providing easy access to deployment addresses and configuration for Graph Protocol contracts. -### Features +## Features - **Protocol deployments** - Provides a simple interface to interact with protocol contracts without having to configure contract addresses or ABIs. - **Transaction logging** - Transactions made via the plugin are automatically awaited and logged. @@ -44,7 +44,7 @@ export default config // or just "export default hardhatBaseConfig" To manually configure target networks: -**Hardhat: Network config** +#### Hardhat: Network config ```ts networks: { @@ -59,7 +59,7 @@ To manually configure target networks: } ``` -**Hardhat: Graph config** +#### Hardhat: Graph config Additionally, the plugin adds a new config field to hardhat's config file: `graph`. This can be used used to define defaults for all networks: @@ -85,14 +85,14 @@ This plugin exposes functionality via a simple API: const graph = hre.graph() ``` -The interface for the graph object can be found [here](src/types.ts), it's expanded version lookg like this: +See [types.ts](src/types.ts) for graph object interface, expanded version looks like this: ```ts export type GraphRuntimeEnvironment = { [deploymentName]: { contracts: DeploymentContractsType addressBook: DeploymentAddressBookType - actions: DeplyomentActionsType + actions: DeploymentActionsType } provider: HardhatEthersProvider chainId: number @@ -119,7 +119,7 @@ Each deployment will be of the form: [deploymentName]: { contracts: DeploymentContractsType, addressBook: DeploymentAddressBookType, - actions: DeplyomentActionsType + actions: DeploymentActionsType }, ``` @@ -129,7 +129,7 @@ Where: - `addressBook`: an object allowing read and write access to the deployment's address book. - `actions`: (optional) an object with helper functions to perform common actions in the associated deployment. -**Transaction logging** +### Transaction logging Any transactions made using the `contracts` object will be automatically logged both to the console and to a file: @@ -139,7 +139,7 @@ Any transactions made using the `contracts` object will be automatically logged Note that this does not apply to getter functions (`view` or `pure`) as those are not state modifying calls. An example log output: -``` +```text [2025-04-10T20:32:37.182Z] > Sending transaction: HorizonStaking.addToProvision [2025-04-10T20:32:37.182Z] = Sender: 0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E [2025-04-10T20:32:37.182Z] = Contract: 0x865365C425f3A593Ffe698D9c4E6707D14d51e08 @@ -156,7 +156,7 @@ An example log output: **Note** Transaction logging requires using js Proxy which strips down some type definitions from contract methods. This means that when transaction logging is enabled `contract.functionName.estimateGas` for example will not be available. -**Transaction auto-awaiting** +### Transaction auto-awaiting Any transactions made using the `contracts` object will be automatically awaited: @@ -170,7 +170,7 @@ const tx = await graph.horizon.contracts.GraphToken.approve('0xDEADBEEF', 100) await tx.wait(10) ``` -**Examples** +### Examples ```js const graph = hre.graph() diff --git a/packages/hardhat-graph-protocol/package.json b/packages/hardhat-graph-protocol/package.json index 9e0ed4e06..3348f165e 100644 --- a/packages/hardhat-graph-protocol/package.json +++ b/packages/hardhat-graph-protocol/package.json @@ -25,12 +25,18 @@ } }, "scripts": { - "build": "tsc", + "build": "pnpm build:dep && pnpm build:self", + "build:dep": "pnpm --filter '@graphprotocol/hardhat-graph-protocol^...' run build:self", + "build:self": "tsc", "build:clean": "pnpm clean && pnpm build", "watch": "tsc --watch", "clean": "rm -rf dist", - "lint": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", - "test": "mocha --exit --recursive 'test/**/*.test.ts'", + "lint": "pnpm lint:ts; pnpm lint:md; pnpm lint:json", + "lint:ts": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", + "lint:json": "prettier -w --cache --log-level warn '**/*.json'", + "test": "pnpm build && pnpm test:self", + "test:self": "mocha --exit --recursive 'test/**/*.test.ts'", "prepublishOnly": "pnpm run build" }, "files": [ @@ -41,7 +47,7 @@ ], "dependencies": { "@graphprotocol/toolshed": "workspace:^", - "@nomicfoundation/hardhat-ethers": "3.0.8", + "@nomicfoundation/hardhat-ethers": "catalog:", "debug": "^4.3.7", "json5": "^2.2.3" }, @@ -51,16 +57,16 @@ "@types/debug": "^4.1.12", "@types/mocha": "^10.0.9", "chai": "^4.0.0", - "eslint": "^8.56.0", - "ethers": "6.13.7", - "hardhat": "^2.22.16", + "eslint": "catalog:", + "ethers": "catalog:", + "hardhat": "catalog:", "hardhat-secure-accounts": "^1.0.4", "mocha": "^10.8.2", "ts-node": "^8.0.0", - "typescript": "^5.6.3" + "typescript": "catalog:" }, "peerDependencies": { - "ethers": "6.13.7", - "hardhat": "^2.22.16" + "ethers": "catalog:", + "hardhat": "catalog:" } } diff --git a/packages/horizon/.markdownlint.json b/packages/horizon/.markdownlint.json new file mode 100644 index 000000000..18947b0be --- /dev/null +++ b/packages/horizon/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.markdownlint.json" +} diff --git a/packages/horizon/natspec-smells.config.js b/packages/horizon/natspec-smells.config.js deleted file mode 100644 index 5110db500..000000000 --- a/packages/horizon/natspec-smells.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * List of supported options: https://github.com/defi-wonderland/natspec-smells?tab=readme-ov-file#options - */ - -/** @type {import('@defi-wonderland/natspec-smells').Config} */ -module.exports = { - include: 'contracts/**/*.sol', - exclude: ['contracts/mocks/**/*.sol', 'contracts/**/LibFixedMath.sol'], - constructorNatspec: true, - enforceInheritdoc: false, -} diff --git a/packages/horizon/package.json b/packages/horizon/package.json index a6f45d9bd..8583172c4 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -20,25 +20,29 @@ "README.md" ], "scripts": { - "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:natspec; pnpm lint:json", + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json", "lint:ts": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", "lint:sol": "solhint --config ../../.solhint.json --fix --noPrompt --noPoster 'contracts/**/*.sol'; prettier -w --cache --log-level warn '**/*.sol'", - "lint:natspec": "natspec-smells --config natspec-smells.config.js", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "clean": "rm -rf build dist cache cache_forge typechain-types", - "build": "hardhat compile", - "test": "forge test", + "build": "pnpm build:dep && pnpm build:self", + "build:dep": "pnpm --filter '@graphprotocol/horizon^...' run build:self", + "build:self": "hardhat compile", + "test": "pnpm build && pnpm test:self", + "test:self": "forge test", "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test test/deployment/*.ts", "test:integration": "./scripts/integration", + "test:coverage": "pnpm build && pnpm test:coverage:self", + "test:coverage:self": "forge coverage", "prepublishOnly": "pnpm run build" }, "devDependencies": { - "@defi-wonderland/natspec-smells": "^1.1.6", "@graphprotocol/contracts": "workspace:^", "@graphprotocol/interfaces": "workspace:^", "@graphprotocol/toolshed": "workspace:^", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "3.0.8", + "@nomicfoundation/hardhat-ethers": "catalog:", "@nomicfoundation/hardhat-foundry": "^1.1.1", "@nomicfoundation/hardhat-ignition": "^0.15.9", "@nomicfoundation/hardhat-ignition-ethers": "^0.15.9", @@ -55,23 +59,23 @@ "@types/mocha": ">=9.1.0", "@types/node": ">=16.0.0", "chai": "^4.2.0", - "eslint": "^8.56.0", - "ethers": "6.13.7", + "eslint": "catalog:", + "ethers": "catalog:", "forge-std": "https://github.com/foundry-rs/forge-std/tarball/v1.9.7", "glob": "^11.0.1", - "hardhat": "^2.22.18", + "hardhat": "catalog:", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.8", "hardhat-graph-protocol": "workspace:^", "hardhat-secure-accounts": "^1.0.5", - "lint-staged": "^15.2.2", - "prettier": "^3.2.5", - "prettier-plugin-solidity": "^1.3.1", - "solhint": "^5.1.0", + "lint-staged": "catalog:", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", "solidity-coverage": "^0.8.0", "ts-node": ">=8.0.0", "typechain": "^8.3.0", - "typescript": "^5.6.3" + "typescript": "catalog:" }, "lint-staged": { "contracts/**/*.sol": [ diff --git a/packages/horizon/tsconfig.json b/packages/horizon/tsconfig.json index b64264422..1306ad4f0 100644 --- a/packages/horizon/tsconfig.json +++ b/packages/horizon/tsconfig.json @@ -11,7 +11,6 @@ "test/**/*.ts", "ignition/**/*.ts", "eslint.config.js", - "prettier.config.js", - "natspec-smells.config.js" + "prettier.config.js" ] } diff --git a/packages/interfaces/.solhint.json b/packages/interfaces/.solhint.json new file mode 100644 index 000000000..d30847305 --- /dev/null +++ b/packages/interfaces/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": ["solhint:recommended", "./../../.solhint.json"] +} diff --git a/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol b/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol index aae740095..7ea628e20 100644 --- a/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol +++ b/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol @@ -5,4 +5,3 @@ pragma solidity ^0.7.6 || 0.8.27; interface ILegacyRewardsManager { function getRewards(address allocationID) external view returns (uint256); } - diff --git a/packages/interfaces/package.json b/packages/interfaces/package.json index a4a35c3ab..de7fe799e 100644 --- a/packages/interfaces/package.json +++ b/packages/interfaces/package.json @@ -34,32 +34,33 @@ "license": "GPL-2.0-or-later", "scripts": { "clean": "rm -rf dist dist-v5 cache artifacts types types-v5 wagmi", - "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:json", + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json", "lint:ts": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", "lint:sol": "solhint --fix --noPrompt --noPoster 'contracts/**/*.sol'; prettier -w --cache --log-level warn 'contracts/**/*.sol'", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "format": "prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx,json,md,yaml,yml}'", - "build": "scripts/build.sh", + "build": "pnpm build:self", + "build:self": "scripts/build.sh", "build:clean": "pnpm clean && pnpm build", "watch": "tsc --watch", "prepublishOnly": "pnpm run build" }, "devDependencies": { - "@defi-wonderland/natspec-smells": "^1.1.6", "@nomicfoundation/hardhat-toolbox": "^4.0.0", "@openzeppelin/contracts": "3.4.1", "@openzeppelin/contracts-upgradeable": "3.4.2", "@typechain/ethers-v5": "^10.2.1", "@wagmi/cli": "^2.3.1", - "ethers": "6.13.7", + "ethers": "catalog:", "ethers-v5": "npm:ethers@5.7.2", "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "hardhat": "^2.24.0", - "markdownlint-cli": "^0.45.0", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "solhint": "5.1.0", + "hardhat": "catalog:", + "markdownlint-cli": "catalog:", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", "typechain": "^8.3.2", "viem": "^2.31.7" } diff --git a/packages/subgraph-service/.markdownlint.json b/packages/subgraph-service/.markdownlint.json new file mode 100644 index 000000000..18947b0be --- /dev/null +++ b/packages/subgraph-service/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.markdownlint.json" +} diff --git a/packages/subgraph-service/natspec-smells.config.js b/packages/subgraph-service/natspec-smells.config.js deleted file mode 100644 index dc4205e72..000000000 --- a/packages/subgraph-service/natspec-smells.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * List of supported options: https://github.com/defi-wonderland/natspec-smells?tab=readme-ov-file#options - */ - -/** @type {import('@defi-wonderland/natspec-smells').Config} */ -module.exports = { - include: 'contracts/**/*.sol', - exclude: ['contracts/mocks/**/*.sol'], - constructorNatspec: true, - enforceInheritdoc: false, -} diff --git a/packages/subgraph-service/package.json b/packages/subgraph-service/package.json index cfa05daae..fa29f7c27 100644 --- a/packages/subgraph-service/package.json +++ b/packages/subgraph-service/package.json @@ -18,26 +18,30 @@ "README.md" ], "scripts": { - "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:natspec; pnpm lint:json", + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json", "lint:ts": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", "lint:sol": "solhint --config ../../.solhint.json --fix --noPrompt --noPoster 'contracts/**/*.sol'; prettier -w --cache --log-level warn '**/*.sol'", - "lint:natspec": "natspec-smells --config natspec-smells.config.js", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "clean": "rm -rf build dist cache cache_forge typechain-types", - "build": "hardhat compile", - "test": "forge test", + "build": "pnpm build:dep && pnpm build:self", + "build:dep": "pnpm --filter '@graphprotocol/subgraph-service^...' run build:self", + "build:self": "hardhat compile", + "test": "pnpm build && pnpm test:self", + "test:self": "forge test", "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test test/deployment/*.ts", "test:integration": "./scripts/integration", + "test:coverage": "pnpm build && pnpm test:coverage:self", + "test:coverage:self": "forge coverage", "prepublishOnly": "pnpm run build" }, "devDependencies": { - "@defi-wonderland/natspec-smells": "^1.1.6", "@graphprotocol/contracts": "workspace:^", "@graphprotocol/horizon": "workspace:^", "@graphprotocol/interfaces": "workspace:^", "@graphprotocol/toolshed": "workspace:^", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "3.0.8", + "@nomicfoundation/hardhat-ethers": "catalog:", "@nomicfoundation/hardhat-foundry": "^1.1.1", "@nomicfoundation/hardhat-ignition": "^0.15.9", "@nomicfoundation/hardhat-ignition-ethers": "^0.15.9", @@ -54,25 +58,25 @@ "@types/mocha": ">=9.1.0", "@types/node": ">=16.0.0", "chai": "^4.2.0", - "eslint": "^8.56.0", - "ethers": "6.13.7", + "eslint": "catalog:", + "ethers": "catalog:", "forge-std": "https://github.com/foundry-rs/forge-std/tarball/v1.9.7", "glob": "^11.0.1", - "hardhat": "^2.22.18", + "hardhat": "catalog:", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.8", "hardhat-graph-protocol": "workspace:^", "hardhat-secure-accounts": "^1.0.5", "json5": "^2.2.3", - "lint-staged": "^15.2.2", - "prettier": "^3.2.5", - "prettier-plugin-solidity": "^1.3.1", - "solhint": "^5.1.0", + "lint-staged": "catalog:", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", "solidity-coverage": "^0.8.0", "solidity-docgen": "^0.6.0-beta.36", "ts-node": ">=8.0.0", "typechain": "^8.3.0", - "typescript": "^5.3.3" + "typescript": "catalog:" }, "lint-staged": { "contracts/**/*.sol": [ diff --git a/packages/subgraph-service/tsconfig.json b/packages/subgraph-service/tsconfig.json index 24570e8ab..03faad598 100644 --- a/packages/subgraph-service/tsconfig.json +++ b/packages/subgraph-service/tsconfig.json @@ -9,7 +9,6 @@ "scripts/**/*.ts", "tasks/**/*.ts", "test/**/*.ts", - "ignition/**/*.ts", - "natspec-smells.config.js" + "ignition/**/*.ts" ] } diff --git a/packages/token-distribution/.graphclient-extracted/index.d.ts b/packages/token-distribution/.graphclient-extracted/index.d.ts new file mode 100644 index 000000000..faaba1f58 --- /dev/null +++ b/packages/token-distribution/.graphclient-extracted/index.d.ts @@ -0,0 +1,552 @@ +import { GraphQLResolveInfo, SelectionSetNode, FieldNode, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +import type { GetMeshOptions } from '@graphql-mesh/runtime'; +import type { YamlConfig } from '@graphql-mesh/types'; +import { MeshHTTPHandler } from '@graphql-mesh/http'; +import { ExecuteMeshFn, SubscribeMeshFn, MeshContext as BaseMeshContext, MeshInstance } from '@graphql-mesh/runtime'; +import type { TokenDistributionTypes } from './sources/token-distribution/types'; +import type { GraphNetworkTypes } from './sources/graph-network/types'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; + BigDecimal: any; + BigInt: any; + Bytes: any; + Int8: any; + Timestamp: any; +}; +export type TokenLockWallet = { + /** The address of the token lock wallet */ + id: Scalars['ID']; + /** The Manager address */ + manager: Scalars['Bytes']; + /** The hash of the initializer */ + initHash: Scalars['Bytes']; + /** Address of the beneficiary of locked tokens */ + beneficiary: Scalars['Bytes']; + /** The token being used (GRT) */ + token: Scalars['Bytes']; + /** Amount of tokens to be managed by the lock contract */ + managedAmount: Scalars['BigInt']; + /** Start time of the release schedule */ + startTime: Scalars['BigInt']; + /** End time of the release schedule */ + endTime: Scalars['BigInt']; + /** Number of periods between start time and end time */ + periods: Scalars['BigInt']; + /** Time when the releases start */ + releaseStartTime: Scalars['BigInt']; + /** Time the cliff vests, 0 if no cliff */ + vestingCliffTime: Scalars['BigInt']; + /** Whether or not the contract is revocable */ + revocable?: Maybe; + /** True if the beneficiary has approved addresses that the manager has approved */ + tokenDestinationsApproved: Scalars['Boolean']; + /** The amount of tokens that have been resleased */ + tokensReleased: Scalars['BigInt']; + /** The amount of tokens that have been withdrawn */ + tokensWithdrawn: Scalars['BigInt']; + /** The amount of tokens that have been revoked */ + tokensRevoked: Scalars['BigInt']; + /** The block this wlalet was created */ + blockNumberCreated: Scalars['BigInt']; + /** The creation tx hash of the wallet */ + txHash: Scalars['Bytes']; + /** ETH balance for L2 transfer. */ + ethBalance: Scalars['BigInt']; + /** Tokens sent to L2 */ + tokensTransferredToL2: Scalars['BigInt']; + /** Whether the vesting contract has experienced a transfer to L2 */ + transferredToL2: Scalars['Boolean']; + /** Timestamp for the L1 -> L2 Transfer. */ + firstTransferredToL2At?: Maybe; + /** Block number for the L1 -> L2 Transfer. */ + firstTransferredToL2AtBlockNumber?: Maybe; + /** Transaction hash for the L1 -> L2 Transfer. */ + firstTransferredToL2AtTx?: Maybe; + /** Timestamp for the L1 -> L2 Transfer. */ + lastTransferredToL2At?: Maybe; + /** Block number for the L1 -> L2 Transfer. */ + lastTransferredToL2AtBlockNumber?: Maybe; + /** Transaction hash for the L1 -> L2 Transfer. */ + lastTransferredToL2AtTx?: Maybe; + /** Wallet address set for L2 transfer */ + l2WalletAddress?: Maybe; + /** L1 wallet address that triggered the creation for this wallet in L2. Only available if the L2 wallet was created through transfer */ + l1WalletAddress?: Maybe; + /** Beneficiary set for L2 transfer. Only for locked tokens codepath, fully vested won't be setting this */ + l2Beneficiary?: Maybe; + /** Whether the wallet is fully vested or not. Fully vested wallets will have an l2WalletAddress set that is not a TokenLockWallet, but rather a normal EOA, since they can withdraw the funds whenever they please */ + l2WalletIsTokenLock?: Maybe; + /** Tokens sent to L1 */ + tokensTransferredToL1: Scalars['BigInt']; + /** Whether the vesting contract has experienced a transfer to L1 */ + transferredToL1: Scalars['Boolean']; + /** Timestamp for the L2 -> L1 Transfer of locked funds. */ + firstLockedFundsTransferredToL1At?: Maybe; + /** Block number for the L2 -> L1 Transfer of locked funds. */ + firstLockedFundsTransferredToL1AtBlockNumber?: Maybe; + /** Transaction hash for the L2 -> L1 Transfer of locked funds. */ + firstLockedFundsTransferredToL1AtTx?: Maybe; + /** Timestamp for the L2 -> L1 Transfer of locked funds. */ + lastLockedFundsTransferredToL1At?: Maybe; + /** Block number for the L2 -> L1 Transfer of locked funds. */ + lastLockedFundsTransferredToL1AtBlockNumber?: Maybe; + /** Transaction hash for the L2 -> L1 Transfer of locked funds. */ + lastLockedFundsTransferredToL1AtTx?: Maybe; + /** Tokens sent to L1 (First time) */ + firstLockedFundsTransferredToL1Amount: Scalars['BigInt']; + /** Tokens sent to L1 (Last time) */ + lastLockedFundsTransferredToL1Amount: Scalars['BigInt']; +}; +export type Curator = { + /** Eth address of the Curator */ + id: Scalars['ID']; + /** Time this curator was created */ + createdAt: Scalars['Int']; + /** Graph account of this curator */ + account: GraphAccount; + /** CUMULATIVE tokens signalled on all the subgraphs */ + totalSignalledTokens: Scalars['BigInt']; + /** CUMULATIVE tokens unsignalled on all the subgraphs */ + totalUnsignalledTokens: Scalars['BigInt']; + /** Subgraphs the curator is curating */ + signals: Array; + /** Default display name is the current default name. Used for filtered queries */ + defaultDisplayName?: Maybe; + /** CUMULATIVE tokens signalled on all names */ + totalNameSignalledTokens: Scalars['BigInt']; + /** CUMULATIVE tokens unsignalled on all names */ + totalNameUnsignalledTokens: Scalars['BigInt']; + /** CUMULATIVE withdrawn tokens from deprecated subgraphs */ + totalWithdrawnTokens: Scalars['BigInt']; + /** Subgraphs the curator is curating */ + nameSignals: Array; + /** NOT IMPLEMENTED - Summation of realized rewards from all Signals */ + realizedRewards: Scalars['BigInt']; + /** NOT IMPLEMENTED - Annualized rate of return on curator signal */ + annualizedReturn: Scalars['BigDecimal']; + /** NOT IMPLEMENTED - Total return of the curator */ + totalReturn: Scalars['BigDecimal']; + /** NOT IMPLEMENTED - Signaling efficiency of the curator */ + signalingEfficiency: Scalars['BigDecimal']; + /** CURRENT summed name signal for all bonding curves */ + totalNameSignal: Scalars['BigDecimal']; + /** Total curator cost basis of all shares of name pools purchased on all bonding curves */ + totalNameSignalAverageCostBasis: Scalars['BigDecimal']; + /** totalNameSignalAverageCostBasis / totalNameSignal */ + totalAverageCostBasisPerNameSignal: Scalars['BigDecimal']; + /** CURRENT summed signal for all bonding curves */ + totalSignal: Scalars['BigDecimal']; + /** Total curator cost basis of all version signal shares purchased on all bonding curves. Includes those purchased through GNS name pools */ + totalSignalAverageCostBasis: Scalars['BigDecimal']; + /** totalSignalAverageCostBasis / totalSignal */ + totalAverageCostBasisPerSignal: Scalars['BigDecimal']; + /** Total amount of signals created by this user */ + signalCount: Scalars['Int']; + /** Amount of active signals for this user */ + activeSignalCount: Scalars['Int']; + /** Total amount of name signals created by this user */ + nameSignalCount: Scalars['Int']; + /** Amount of active name signals for this user */ + activeNameSignalCount: Scalars['Int']; + /** Total amount of name signals and signals created by this user. signalCount + nameSignalCount */ + combinedSignalCount: Scalars['Int']; + /** Amount of active name signals and signals for this user. signalCount + nameSignalCount */ + activeCombinedSignalCount: Scalars['Int']; +}; +export type Delegator = { + /** Delegator address */ + id: Scalars['ID']; + /** Graph account of the delegator */ + account: GraphAccount; + /** Stakes of this delegator */ + stakes: Array; + /** CUMULATIVE staked tokens in DelegatorStakes of this Delegator */ + totalStakedTokens: Scalars['BigInt']; + /** CUMULATIVE unstaked tokens in DelegatorStakes of this Delegator */ + totalUnstakedTokens: Scalars['BigInt']; + /** Time created at */ + createdAt: Scalars['Int']; + /** Total realized rewards on all delegated stakes. Realized rewards are added when undelegating and realizing a profit */ + totalRealizedRewards: Scalars['BigDecimal']; + /** Total DelegatedStake entity count (Active and inactive) */ + stakesCount: Scalars['Int']; + /** Active DelegatedStake entity count. Active means it still has GRT delegated */ + activeStakesCount: Scalars['Int']; + /** Default display name is the current default name. Used for filtered queries */ + defaultDisplayName?: Maybe; +}; +export type GraphAccount = { + /** Graph account ID */ + id: Scalars['ID']; + /** All names this graph account has claimed from all name systems */ + names: Array; + /** Default name the graph account has chosen */ + defaultName?: Maybe; + /** Time the account was created */ + createdAt: Scalars['Int']; + /** Default display name is the current default name. Used for filtered queries in the explorer */ + defaultDisplayName?: Maybe; + metadata?: Maybe; + /** Operator of other Graph Accounts */ + operatorOf: Array; + /** Operators of this Graph Accounts */ + operators: Array; + /** Graph token balance */ + balance: Scalars['BigInt']; + /** Balance received due to failed signal transfer from L1 */ + balanceReceivedFromL1Signalling: Scalars['BigInt']; + /** Balance received due to failed delegation transfer from L1 */ + balanceReceivedFromL1Delegation: Scalars['BigInt']; + /** Amount this account has approved staking to transfer their GRT */ + curationApproval: Scalars['BigInt']; + /** Amount this account has approved curation to transfer their GRT */ + stakingApproval: Scalars['BigInt']; + /** Amount this account has approved the GNS to transfer their GRT */ + gnsApproval: Scalars['BigInt']; + /** Subgraphs the graph account owns */ + subgraphs: Array; + /** Time that this graph account became a developer */ + developerCreatedAt?: Maybe; + /** NOT IMPLEMENTED - Total query fees the subgraphs created by this account have accumulated in GRT */ + subgraphQueryFees: Scalars['BigInt']; + /** Disputes this graph account has created */ + createdDisputes: Array; + /** Disputes against this graph account */ + disputesAgainst: Array; + /** Curator fields for this GraphAccount. Null if never curated */ + curator?: Maybe; + /** Indexer fields for this GraphAccount. Null if never indexed */ + indexer?: Maybe; + /** Delegator fields for this GraphAccount. Null if never delegated */ + delegator?: Maybe; + /** Name signal transactions created by this GraphAccount */ + nameSignalTransactions: Array; + bridgeWithdrawalTransactions: Array; + bridgeDepositTransactions: Array; + tokenLockWallets: Array; +}; +export type GraphNetwork = { + /** ID is set to 1 */ + id: Scalars['ID']; + /** Controller address */ + controller: Scalars['Bytes']; + /** Graph token address */ + graphToken: Scalars['Bytes']; + /** Epoch manager address */ + epochManager: Scalars['Bytes']; + /** Epoch Manager implementations. Last in the array is current */ + epochManagerImplementations: Array; + /** Curation address */ + curation: Scalars['Bytes']; + /** Curation implementations. Last in the array is current */ + curationImplementations: Array; + /** Staking address */ + staking: Scalars['Bytes']; + /** Graph token implementations. Last in the array is current */ + stakingImplementations: Array; + /** Dispute manager address */ + disputeManager: Scalars['Bytes']; + /** GNS address */ + gns: Scalars['Bytes']; + /** Service registry address */ + serviceRegistry: Scalars['Bytes']; + /** Rewards manager address */ + rewardsManager: Scalars['Bytes']; + /** Rewards Manager implementations. Last in the array is current */ + rewardsManagerImplementations: Array; + /** True if the protocol is paused */ + isPaused: Scalars['Boolean']; + /** True if the protocol is partially paused */ + isPartialPaused: Scalars['Boolean']; + /** Governor of the controller (i.e. the whole protocol) */ + governor: Scalars['Bytes']; + /** Pause guardian address */ + pauseGuardian: Scalars['Bytes']; + /** Percentage of fees going to curators. In parts per million */ + curationPercentage: Scalars['Int']; + /** Percentage of fees burn as protocol fee. In parts per million */ + protocolFeePercentage: Scalars['Int']; + /** Ratio of max staked delegation tokens to indexers stake that earns rewards */ + delegationRatio: Scalars['Int']; + /** [DEPRECATED] Epochs to wait before fees can be claimed in rebate pool */ + channelDisputeEpochs: Scalars['Int']; + /** Epochs to wait before delegators can settle */ + maxAllocationEpochs: Scalars['Int']; + /** Time in blocks needed to wait to unstake */ + thawingPeriod: Scalars['Int']; + /** Minimum time an Indexer must use for resetting their Delegation parameters */ + delegationParametersCooldown: Scalars['Int']; + /** Minimum GRT an indexer must stake */ + minimumIndexerStake: Scalars['BigInt']; + /** Contracts that have been approved to be a slasher */ + slashers?: Maybe>; + /** Time in epochs a delegator needs to wait to withdraw delegated stake */ + delegationUnbondingPeriod: Scalars['Int']; + /** [DEPRECATED] Alpha in the cobbs douglas formula */ + rebateRatio: Scalars['BigDecimal']; + /** Alpha in the exponential formula */ + rebateAlpha: Scalars['BigDecimal']; + /** Lambda in the exponential formula */ + rebateLambda: Scalars['BigDecimal']; + /** Tax that delegators pay to deposit. In Parts per million */ + delegationTaxPercentage: Scalars['Int']; + /** Asset holder for the protocol */ + assetHolders?: Maybe>; + /** Total amount of indexer stake transferred to L2 */ + totalTokensStakedTransferredToL2: Scalars['BigInt']; + /** Total amount of delegated tokens transferred to L2 */ + totalDelegatedTokensTransferredToL2: Scalars['BigInt']; + /** Total amount of delegated tokens transferred to L2 */ + totalSignalledTokensTransferredToL2: Scalars['BigInt']; + /** The total amount of GRT staked in the staking contract */ + totalTokensStaked: Scalars['BigInt']; + /** NOT IMPLEMENTED - Total tokens that are settled and waiting to be claimed */ + totalTokensClaimable: Scalars['BigInt']; + /** Total tokens that are currently locked or withdrawable in the network from unstaking */ + totalUnstakedTokensLocked: Scalars['BigInt']; + /** Total GRT currently in allocation */ + totalTokensAllocated: Scalars['BigInt']; + /** Total delegated tokens in the protocol */ + totalDelegatedTokens: Scalars['BigInt']; + /** The total amount of GRT signalled in the Curation contract */ + totalTokensSignalled: Scalars['BigInt']; + /** Total GRT currently curating via the Auto-Migrate function */ + totalTokensSignalledAutoMigrate: Scalars['BigDecimal']; + /** Total GRT currently curating to a specific version */ + totalTokensSignalledDirectly: Scalars['BigDecimal']; + /** Total query fees generated in the network */ + totalQueryFees: Scalars['BigInt']; + /** Total query fees collected by indexers */ + totalIndexerQueryFeesCollected: Scalars['BigInt']; + /** Total query fees rebates claimed by indexers */ + totalIndexerQueryFeeRebates: Scalars['BigInt']; + /** Total query fees rebates claimed by delegators */ + totalDelegatorQueryFeeRebates: Scalars['BigInt']; + /** Total query fees payed to curators */ + totalCuratorQueryFees: Scalars['BigInt']; + /** Total protocol taxes applied to the query fees */ + totalTaxedQueryFees: Scalars['BigInt']; + /** Total unclaimed rebates. Includes unclaimed rebates, and rebates lost in rebates mechanism */ + totalUnclaimedQueryFeeRebates: Scalars['BigInt']; + /** Total indexing rewards minted */ + totalIndexingRewards: Scalars['BigInt']; + /** Total indexing rewards minted to Delegators */ + totalIndexingDelegatorRewards: Scalars['BigInt']; + /** Total indexing rewards minted to Indexers */ + totalIndexingIndexerRewards: Scalars['BigInt']; + /** (Deprecated) The issuance rate of GRT per block before GIP-0037. To get annual rate do (networkGRTIssuance * 10^-18)^(blocksPerYear) */ + networkGRTIssuance: Scalars['BigInt']; + /** The issuance rate of GRT per block after GIP-0037. To get annual rate do (networkGRTIssuancePerBlock * blocksPerYear) */ + networkGRTIssuancePerBlock: Scalars['BigInt']; + /** Address of the availability oracle */ + subgraphAvailabilityOracle: Scalars['Bytes']; + /** Default reserve ratio for all subgraphs. In parts per million */ + defaultReserveRatio: Scalars['Int']; + /** Minimum amount of tokens needed to start curating */ + minimumCurationDeposit: Scalars['BigInt']; + /** The fee charged when a curator withdraws signal. In parts per million */ + curationTaxPercentage: Scalars['Int']; + /** Percentage of the GNS migration tax payed by the subgraph owner */ + ownerTaxPercentage: Scalars['Int']; + /** Graph Token supply */ + totalSupply: Scalars['BigInt']; + /** NOT IMPLEMENTED - Price of one GRT in USD */ + GRTinUSD: Scalars['BigDecimal']; + /** NOT IMPLEMENTED - Price of one GRT in ETH */ + GRTinETH?: Maybe; + /** Total amount of GRT minted */ + totalGRTMinted: Scalars['BigInt']; + /** Total amount of GRT burned */ + totalGRTBurned: Scalars['BigInt']; + /** Epoch Length in blocks */ + epochLength: Scalars['Int']; + /** Epoch that was last run */ + lastRunEpoch: Scalars['Int']; + /** Epoch when epoch length was last updated */ + lastLengthUpdateEpoch: Scalars['Int']; + /** Block when epoch length was last updated */ + lastLengthUpdateBlock: Scalars['Int']; + /** Current epoch the protocol is in */ + currentEpoch: Scalars['Int']; + /** Total indexers */ + indexerCount: Scalars['Int']; + /** Number of indexers that currently have some stake in the protocol */ + stakedIndexersCount: Scalars['Int']; + /** Total amount of delegators historically */ + delegatorCount: Scalars['Int']; + /** Total active delegators. Those that still have at least one active delegation. */ + activeDelegatorCount: Scalars['Int']; + /** Total amount of delegations historically */ + delegationCount: Scalars['Int']; + /** Total active delegations. Those delegations that still have GRT staked towards an indexer */ + activeDelegationCount: Scalars['Int']; + /** Total amount of curators historically */ + curatorCount: Scalars['Int']; + /** Total amount of curators historically */ + activeCuratorCount: Scalars['Int']; + /** Total amount of Subgraph entities */ + subgraphCount: Scalars['Int']; + /** Amount of active Subgraph entities */ + activeSubgraphCount: Scalars['Int']; + /** Total amount of SubgraphDeployment entities */ + subgraphDeploymentCount: Scalars['Int']; + /** Total epochs */ + epochCount: Scalars['Int']; + /** Total amount of allocations opened */ + allocationCount: Scalars['Int']; + /** Total amount of allocations currently active */ + activeAllocationCount: Scalars['Int']; + /** Dispute arbitrator */ + arbitrator: Scalars['Bytes']; + /** Penalty to Indexer on successful disputes for query disputes. In parts per million */ + querySlashingPercentage: Scalars['Int']; + /** Penalty to Indexer on successful disputes for indexing disputes. In parts per million */ + indexingSlashingPercentage: Scalars['Int']; + /** [DEPRECATED] Penalty to Indexer on successful disputes for indexing disputes. In parts per million */ + slashingPercentage: Scalars['Int']; + /** Minimum deposit to create a dispute */ + minimumDisputeDeposit: Scalars['BigInt']; + /** Reward to Fisherman on successful disputes. In parts per million */ + fishermanRewardPercentage: Scalars['Int']; + /** Total amount of GRT deposited to the L1 gateway. Note that the actual amount claimed in L2 might be lower due to tickets not redeemed. */ + totalGRTDeposited: Scalars['BigInt']; + /** Total amount of GRT withdrawn from the L2 gateway and claimed in L1. */ + totalGRTWithdrawnConfirmed: Scalars['BigInt']; + /** Total amount of GRT minted by L1 bridge */ + totalGRTMintedFromL2: Scalars['BigInt']; + /** Total amount of GRT deposited to the L1 gateway and redeemed in L2. */ + totalGRTDepositedConfirmed: Scalars['BigInt']; + /** Total amount of GRT withdrawn from the L2 gateway. Note that the actual amount claimed in L1 might be lower due to outbound transactions not finalized. */ + totalGRTWithdrawn: Scalars['BigInt']; + /** Block number for L1. Only implemented for L2 deployments to properly reflect the L1 block used for timings */ + currentL1BlockNumber?: Maybe; +}; +export type Indexer = { + /** Eth address of Indexer */ + id: Scalars['ID']; + /** Time this indexer was created */ + createdAt: Scalars['Int']; + /** Graph account of this indexer */ + account: GraphAccount; + /** Service registry URL for the indexer */ + url?: Maybe; + /** Geohash of the indexer. Shows where their indexer is located in the world */ + geoHash?: Maybe; + /** Default display name is the current default name. Used for filtered queries */ + defaultDisplayName?: Maybe; + /** CURRENT tokens staked in the protocol. Decreases on withdraw, not on lock */ + stakedTokens: Scalars['BigInt']; + /** CURRENT tokens allocated on all subgraphs */ + allocatedTokens: Scalars['BigInt']; + /** NOT IMPLEMENTED - Tokens that have been unstaked and withdrawn */ + unstakedTokens: Scalars['BigInt']; + /** CURRENT tokens locked */ + lockedTokens: Scalars['BigInt']; + /** The block when the Indexers tokens unlock */ + tokensLockedUntil: Scalars['Int']; + /** Active allocations of stake for this Indexer */ + allocations: Array; + /** All allocations of stake for this Indexer (i.e. closed and active) */ + totalAllocations: Array; + /** Number of active allocations of stake for this Indexer */ + allocationCount: Scalars['Int']; + /** All allocations for this Indexer (i.e. closed and active) */ + totalAllocationCount: Scalars['BigInt']; + /** Total query fees collected. Includes the portion given to delegators */ + queryFeesCollected: Scalars['BigInt']; + /** Query fee rebate amount claimed from the protocol through rebates mechanism. Does not include portion given to delegators */ + queryFeeRebates: Scalars['BigInt']; + /** Total indexing rewards earned by this indexer from inflation. Including delegation rewards */ + rewardsEarned: Scalars['BigInt']; + /** The total amount of indexing rewards the indexer kept */ + indexerIndexingRewards: Scalars['BigInt']; + /** The total amount of indexing rewards given to delegators */ + delegatorIndexingRewards: Scalars['BigInt']; + /** Percentage of indexers' own rewards received in relation to its own stake. 1 (100%) means that the indexer is receiving the exact amount that is generated by his own stake */ + indexerRewardsOwnGenerationRatio: Scalars['BigDecimal']; + /** Whether the indexer has been transferred from L1 to L2 partially or fully */ + transferredToL2: Scalars['Boolean']; + /** Timestamp for the FIRST L1 -> L2 Transfer */ + firstTransferredToL2At?: Maybe; + /** Block number for the FIRST L1 -> L2 Transfer */ + firstTransferredToL2AtBlockNumber?: Maybe; + /** Transaction hash for the FIRST L1 -> L2 Transfer */ + firstTransferredToL2AtTx?: Maybe; + /** Timestamp for the latest L1 -> L2 Transfer */ + lastTransferredToL2At?: Maybe; + /** Block number for the latest L1 -> L2 Transfer */ + lastTransferredToL2AtBlockNumber?: Maybe; + /** Transaction hash for the latest L1 -> L2 Transfer */ + lastTransferredToL2AtTx?: Maybe; + /** Amount of GRT transferred to L2. Only visible from L1, as there's no events for it on L2 */ + stakedTokensTransferredToL2: Scalars['BigInt']; + /** ID of the indexer on L2. Null if it's not transferred */ + idOnL2?: Maybe; + /** ID of the indexer on L1. Null if it's not transferred */ + idOnL1?: Maybe; + /** Amount of delegated tokens that can be eligible for rewards */ + delegatedCapacity: Scalars['BigInt']; + /** Total token capacity = delegatedCapacity + stakedTokens */ + tokenCapacity: Scalars['BigInt']; + /** Stake available to earn rewards. tokenCapacity - allocationTokens - lockedTokens */ + availableStake: Scalars['BigInt']; + /** Delegators to this Indexer */ + delegators: Array; + /** CURRENT tokens delegated to the indexer */ + delegatedTokens: Scalars['BigInt']; + /** Ratio between the amount of the indexers own stake over the total usable stake. */ + ownStakeRatio: Scalars['BigDecimal']; + /** Ratio between the amount of delegated stake over the total usable stake. */ + delegatedStakeRatio: Scalars['BigDecimal']; + /** Total shares of the delegator pool */ + delegatorShares: Scalars['BigInt']; + /** Exchange rate of of tokens received for each share */ + delegationExchangeRate: Scalars['BigDecimal']; + /** The percent of indexing rewards generated by the total stake that the Indexer keeps for itself. In parts per million */ + indexingRewardCut: Scalars['Int']; + /** The percent of indexing rewards generated by the delegated stake that the Indexer keeps for itself */ + indexingRewardEffectiveCut: Scalars['BigDecimal']; + /** The percent of reward dilution delegators experience because of overdelegation. Overdelegated stake can't be used to generate rewards but still gets accounted while distributing the generated rewards. This causes dilution of the rewards for the rest of the pool. */ + overDelegationDilution: Scalars['BigDecimal']; + /** The total amount of query fees given to delegators */ + delegatorQueryFees: Scalars['BigInt']; + /** The percent of query rebate rewards the Indexer keeps for itself. In parts per million */ + queryFeeCut: Scalars['Int']; + /** The percent of query rebate rewards generated by the delegated stake that the Indexer keeps for itself */ + queryFeeEffectiveCut: Scalars['BigDecimal']; + /** Amount of blocks a delegator chooses for the waiting period for changing their params */ + delegatorParameterCooldown: Scalars['Int']; + /** Block number for the last time the delegator updated their parameters */ + lastDelegationParameterUpdate: Scalars['Int']; + /** Count of how many times this indexer has been forced to close an allocation */ + forcedClosures: Scalars['Int']; + /** NOT IMPLEMENTED - Total return this indexer has earned */ + totalReturn: Scalars['BigDecimal']; + /** NOT IMPLEMENTED - Annualized rate of return for the indexer */ + annualizedReturn: Scalars['BigDecimal']; + /** NOT IMPLEMENTED - Staking efficiency of the indexer */ + stakingEfficiency: Scalars['BigDecimal']; +}; +export type GraphAccountQuery = { + graphAccount?: Maybe<(Pick & { + indexer?: Maybe>; + curator?: Maybe>; + delegator?: Maybe>; + })>; +}; +export type CuratorWalletsQuery = { + tokenLockWallets: Array>; +}; +export type GraphNetworkQuery = { + graphNetwork?: Maybe>; +}; +export type TokenLockWalletsQuery = { + tokenLockWallets: Array>; +}; \ No newline at end of file diff --git a/packages/token-distribution/.graphclient-extracted/index.js b/packages/token-distribution/.graphclient-extracted/index.js new file mode 100644 index 000000000..649390e14 --- /dev/null +++ b/packages/token-distribution/.graphclient-extracted/index.js @@ -0,0 +1,103 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); + +// Minimal GraphClient for offline builds - contains only what ops/info.ts uses +const { gql } = require('@graphql-mesh/utils'); + +// Mock execute function +const execute = () => { + throw new Error('GraphClient execute() requires API key. This is an offline build with cached types only.'); +}; +exports.execute = execute; + +// Only the query documents actually used +exports.GraphAccountDocument = gql` + query GraphAccount($accountId: ID!, $blockNumber: Int) { + graphAccount(id: $accountId, block: {number: $blockNumber}) { + id + indexer { + stakedTokens + } + curator { + totalSignalledTokens + totalUnsignalledTokens + } + delegator { + totalStakedTokens + totalUnstakedTokens + totalRealizedRewards + } + } +} + `; + +exports.CuratorWalletsDocument = gql` + query CuratorWallets($blockNumber: Int, $first: Int) { + tokenLockWallets( + block: {number: $blockNumber} + where: {periods: 16, startTime: 1608224400, endTime: 1734454800, revocable: Disabled} + first: $first + orderBy: blockNumberCreated + ) { + id + beneficiary + managedAmount + periods + startTime + endTime + revocable + releaseStartTime + vestingCliffTime + initHash + txHash + manager + tokensReleased + tokensWithdrawn + tokensRevoked + blockNumberCreated + } +} + `; + +exports.GraphNetworkDocument = gql` + query GraphNetwork($blockNumber: Int) { + graphNetwork(id: 1, block: {number: $blockNumber}) { + id + totalSupply + } +} + `; + +exports.TokenLockWalletsDocument = gql` + query TokenLockWallets($blockNumber: Int, $first: Int) { + tokenLockWallets(block: {number: $blockNumber}, first: $first, orderBy: id) { + id + beneficiary + managedAmount + periods + startTime + endTime + revocable + releaseStartTime + vestingCliffTime + initHash + txHash + manager + tokensReleased + tokensWithdrawn + tokensRevoked + blockNumberCreated + } +} + `; + +// Mock SDK +function getSdk() { + return { + GraphAccount: () => execute(), + CuratorWallets: () => execute(), + GraphNetwork: () => execute(), + TokenLockWallets: () => execute(), + }; +} +exports.getSdk = getSdk; diff --git a/packages/token-distribution/.solhint.json b/packages/token-distribution/.solhint.json new file mode 100644 index 000000000..d30847305 --- /dev/null +++ b/packages/token-distribution/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": ["solhint:recommended", "./../../.solhint.json"] +} diff --git a/packages/token-distribution/ops/info.ts b/packages/token-distribution/ops/info.ts index 21b8023aa..54dedf4f6 100644 --- a/packages/token-distribution/ops/info.ts +++ b/packages/token-distribution/ops/info.ts @@ -8,7 +8,7 @@ import { task } from 'hardhat/config' import { HardhatRuntimeEnvironment } from 'hardhat/types' import PQueue from 'p-queue' -import * as GraphClient from '../.graphclient' +import * as GraphClient from '../.graphclient-extracted' import { CuratorWalletsDocument, CuratorWalletsQuery, @@ -19,7 +19,7 @@ import { GraphNetworkQuery, TokenLockWalletsDocument, TokenLockWalletsQuery, -} from '../.graphclient' +} from '../.graphclient-extracted' const CoinGeckoClient = new CoinGecko() const RPC_CONCURRENCY = 10 diff --git a/packages/token-distribution/package.json b/packages/token-distribution/package.json index 0f10ae8f6..3288bb0ee 100644 --- a/packages/token-distribution/package.json +++ b/packages/token-distribution/package.json @@ -6,12 +6,18 @@ "main": "index.js", "scripts": { "prepublishOnly": "scripts/prepublish", - "build": "node scripts/build.js", + "build": "pnpm build:dep && pnpm build:self", + "build:dep": "pnpm --filter '@graphprotocol/token-distribution^...' run build:self", + "build:self": "node scripts/build.js", "build:legacy": "scripts/build", + "extract": "node scripts/extract-graphclient.js", "clean": "rm -rf build/ cache/ dist/ .graphclient/ reports/ types/", + "clean:extracted": "rm -rf .graphclient-extracted/", + "clean:all": "rm -rf build/ cache/ dist/ .graphclient/ .graphclient-extracted/", "compile": "hardhat compile --show-stack-traces", "deploy": "pnpm run build && hardhat deploy", - "test": "pnpm build && pnpm --filter @graphprotocol/contracts run build && scripts/test", + "test": "pnpm build && pnpm test:self", + "test:self": "scripts/test", "test:gas": "RUN_EVM=true REPORT_GAS=true scripts/test", "test:coverage:broken": "pnpm build && scripts/coverage", "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json", @@ -56,12 +62,12 @@ "coingecko-api": "^1.0.10", "consola": "^2.15.0", "dotenv": "^16.0.0", - "eslint": "^9.28.0", + "eslint": "catalog:", "ethereum-waffle": "^4.0.10", - "ethers": "^5.7.0", + "ethers": "^5.7.2", "graphql": "^16.5.0", "graphql-yoga": "^5.13.4", - "hardhat": "^2.24.0", + "hardhat": "catalog:", "hardhat-abi-exporter": "^2.0.1", "hardhat-contract-sizer": "^2.0.1", "hardhat-deploy": "^0.7.0-beta.9", @@ -70,13 +76,16 @@ "lodash": "^4.17.21", "markdownlint-cli": "0.45.0", "p-queue": "^6.6.2", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "solhint": "^5.1.0", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", "solidity-coverage": "^0.8.16", "ts-node": "^10.9.2", "typechain": "^8.3.0", - "typescript": "^5.8.3", - "typescript-eslint": "^8.33.1" + "typescript": "catalog:", + "typescript-eslint": "catalog:" + }, + "dependencies": { + "ajv": "^8.17.1" } } diff --git a/packages/token-distribution/scripts/build.js b/packages/token-distribution/scripts/build.js index f40394328..dfcb282f6 100755 --- a/packages/token-distribution/scripts/build.js +++ b/packages/token-distribution/scripts/build.js @@ -98,8 +98,28 @@ async function getDirModTime(dirPath) { } } +// Check if required API keys are available +function hasRequiredApiKeys() { + // Check for Studio API key (required for GraphClient) + const studioApiKey = process.env.STUDIO_API_KEY || process.env.GRAPH_API_KEY + return !!studioApiKey +} + +// Check if extracted GraphClient artifacts exist +function hasExtractedArtifacts() { + const extractedDir = '.graphclient-extracted' + const extractedIndex = path.join(extractedDir, 'index.js') + const extractedTypes = path.join(extractedDir, 'index.d.ts') + return fileExists(extractedIndex) && fileExists(extractedTypes) +} + // Check if GraphClient build is needed async function needsGraphClientBuild() { + // If we have extracted artifacts and no API keys, we don't need a full build + if (!hasRequiredApiKeys() && hasExtractedArtifacts()) { + return false + } + // If GraphClient output doesn't exist, build is needed if (!fileExists(graphClientSchema) || !fileExists(graphClientIndex)) { return true @@ -126,28 +146,49 @@ async function needsContractCompilation() { return contractsSrcTime > artifactsTime } -// Main build function -async function build() { +// Setup GraphClient artifacts for compilation +async function setupGraphClient() { + const hasApiKeys = hasRequiredApiKeys() + const hasExtracted = hasExtractedArtifacts() const graphClientBuildNeeded = await needsGraphClientBuild() - const contractCompilationNeeded = await needsContractCompilation() - // If no build is needed, exit early - if (!graphClientBuildNeeded && !contractCompilationNeeded) { - console.log('All build targets are up to date.') + // If no API keys but we have extracted artifacts, use those instead of trying to build + if (!hasApiKeys && hasExtracted) { + console.log('๐Ÿ“ฆ Using cached GraphClient artifacts (no API key)') + console.warn('โš ๏ธ Schemas might be outdated - set STUDIO_API_KEY or GRAPH_API_KEY to refresh') return } - // Build GraphClient if needed if (graphClientBuildNeeded) { - console.log('Building GraphClient...') - execSync('pnpm graphclient build --fileType json', { stdio: 'inherit' }) + if (hasApiKeys) { + // Stage 1: Download with API key - fail if download fails + console.log('๐Ÿ“ฅ Downloading GraphClient schemas...') + execSync('pnpm graphclient build --fileType json', { stdio: 'inherit' }) + + // Stage 2: Extract essential artifacts for future offline builds + console.log('๐Ÿ“ฆ Extracting essential artifacts...') + execSync('node scripts/extract-graphclient.js', { stdio: 'inherit' }) + } else { + // No API key and no cached artifacts - cannot proceed + // To fix: Set STUDIO_API_KEY or GRAPH_API_KEY environment variable + console.error('โŒ No API key or cached GraphClient artifacts available') + process.exit(1) + } } else { - console.log('GraphClient is up to date.') + console.log('๐Ÿ“ฆ GraphClient up to date') } +} + +// Main build function +async function build() { + const contractCompilationNeeded = await needsContractCompilation() + + // Stage 1 & 2: Setup GraphClient (download + extract, or use extracted) + await setupGraphClient() - // Compile contracts if needed + // Stage 3: Compile contracts if needed if (contractCompilationNeeded) { - console.log('Compiling contracts...') + console.log('๐Ÿ”จ Compiling contracts...') // // Copy working TypeChain modules from contracts package to fix compatibility // console.log('Copying TypeChain modules from contracts package...') @@ -160,7 +201,7 @@ async function build() { console.log('Contracts are up to date.') } - console.log('Build completed successfully.') + console.log('โœ… Build completed successfully.') } // Run the build diff --git a/packages/token-distribution/scripts/extract-graphclient.js b/packages/token-distribution/scripts/extract-graphclient.js new file mode 100644 index 000000000..771abc74b --- /dev/null +++ b/packages/token-distribution/scripts/extract-graphclient.js @@ -0,0 +1,190 @@ +#!/usr/bin/env node + +/** + * Extract essential GraphClient artifacts for offline builds + * + * This script extracts only the minimal TypeScript types and query documents + * needed for compilation from the full GraphClient build output. + * The extracted files are small and can be committed to git. + */ + +const fs = require('fs') +const path = require('path') + +// Paths +const graphClientDir = '.graphclient' +const extractedDir = '.graphclient-extracted' +const graphClientIndex = path.join(graphClientDir, 'index.js') +const graphClientTypes = path.join(graphClientDir, 'index.d.ts') + +// Helper functions +const fileExists = (filePath) => fs.existsSync(filePath) +const ensureDir = (dirPath) => { + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }) + } +} + +// Create minimal self-contained GraphClient artifacts +function createMinimalArtifacts() { + if (!fileExists(graphClientTypes)) { + throw new Error('GraphClient types not found. Run GraphClient build first.') + } + + // Read the original files + const originalTypes = fs.readFileSync(graphClientTypes, 'utf8') + const originalJs = fs.readFileSync(graphClientIndex, 'utf8') + + // Extract only the specific types we need + const neededTypes = [ + 'TokenLockWallet', + 'GraphNetwork', + 'GraphAccount', + 'Indexer', + 'Curator', + 'Delegator', + 'CuratorWalletsQuery', + 'GraphAccountQuery', + 'GraphNetworkQuery', + 'TokenLockWalletsQuery', + 'Maybe', + 'InputMaybe', + 'Scalars', + ] + + // Extract only the query documents we need + const neededQueries = [ + 'CuratorWalletsDocument', + 'GraphAccountDocument', + 'GraphNetworkDocument', + 'TokenLockWalletsDocument', + ] + + // Create minimal types file + const minimalTypes = extractSpecificTypes(originalTypes, neededTypes) + + // Create minimal JS file + const minimalJs = createMinimalJs(originalJs, neededQueries) + + return { types: minimalTypes, js: minimalJs } +} + +// Extract specific types from the original types file +function extractSpecificTypes(content, neededTypes) { + const lines = content.split('\n') + const result = [] + let currentType = null + let braceDepth = 0 + let inNeededType = false + + // Always include imports and utility types + for (const line of lines) { + if (line.includes('import ') || line.includes('export {')) { + result.push(line) + continue + } + + // Check if this starts a type we need + const typeMatch = line.match(/export (?:type|interface) (\w+)/) + if (typeMatch) { + currentType = typeMatch[1] + if (neededTypes.includes(currentType)) { + inNeededType = true + braceDepth = 0 + result.push(line) + braceDepth += (line.match(/{/g) || []).length + braceDepth -= (line.match(/}/g) || []).length + if (line.trim().endsWith(';') && braceDepth === 0) { + inNeededType = false + } + continue + } else { + inNeededType = false + continue + } + } + + if (inNeededType) { + result.push(line) + braceDepth += (line.match(/{/g) || []).length + braceDepth -= (line.match(/}/g) || []).length + if (braceDepth === 0 && (line.trim().endsWith(';') || line.trim().endsWith('}'))) { + inNeededType = false + } + } + } + + return result.join('\n') +} + +// Create minimal JS with only needed queries +function createMinimalJs(content, neededQueries) { + // Extract only the queries we need + const queryRegex = /exports\.(.*Document)\s*=\s*\(0,\s*utils_1\.gql\)\s*`([\s\S]*?)`\s*;/g + const extractedQueries = [] + let match + + while ((match = queryRegex.exec(content)) !== null) { + const [, docName, query] = match + if (neededQueries.includes(docName)) { + extractedQueries.push(`exports.${docName} = gql\`${query}\`;`) + } + } + + return `"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); + +// Minimal GraphClient for offline builds - contains only what ops/info.ts uses +const { gql } = require('@graphql-mesh/utils'); + +// Mock execute function +const execute = () => { + throw new Error('GraphClient execute() requires API key. This is an offline build with cached types only.'); +}; +exports.execute = execute; + +// Only the query documents actually used +${extractedQueries.join('\n\n')} + +// Mock SDK +function getSdk() { + return { + GraphAccount: () => execute(), + CuratorWallets: () => execute(), + GraphNetwork: () => execute(), + TokenLockWallets: () => execute(), + }; +} +exports.getSdk = getSdk; +` +} + +// The compilation approach handles both types and runtime code together +// No separate query extraction needed + +// Main extract function +async function extract() { + // Ensure extracted directory exists + ensureDir(extractedDir) + + try { + // Create minimal self-contained artifacts (only types/queries used by ops/info.ts) + const artifacts = createMinimalArtifacts() + + // Write the minimal types and runtime code + fs.writeFileSync(path.join(extractedDir, 'index.d.ts'), artifacts.types) + fs.writeFileSync(path.join(extractedDir, 'index.js'), artifacts.js) + + console.log(`โœ… Extracted minimal artifacts to ${extractedDir}/`) + } catch (error) { + console.error('โŒ Extraction failed:', error.message) + process.exit(1) + } +} + +// Run if called directly +if (require.main === module) { + extract() +} + +module.exports = { extract } diff --git a/packages/token-distribution/scripts/test b/packages/token-distribution/scripts/test index 066840a1e..c28e7d3f6 100755 --- a/packages/token-distribution/scripts/test +++ b/packages/token-distribution/scripts/test @@ -42,7 +42,7 @@ fi mkdir -p reports -pnpm run compile +# Build should be done by caller (test script calls build before test:self) if [ "$RUN_EVM" = true ]; then # Run using the standalone evm instance diff --git a/packages/toolshed/.markdownlint.json b/packages/toolshed/.markdownlint.json new file mode 100644 index 000000000..18947b0be --- /dev/null +++ b/packages/toolshed/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.markdownlint.json" +} diff --git a/packages/toolshed/package.json b/packages/toolshed/package.json index b44dd2ef0..129b8c66a 100644 --- a/packages/toolshed/package.json +++ b/packages/toolshed/package.json @@ -32,10 +32,13 @@ } }, "scripts": { - "build": "tsc", + "build": "pnpm build:dep && pnpm build:self", + "build:dep": "pnpm --filter '@graphprotocol/toolshed^...' run build:self", + "build:self": "tsc", "watch": "tsc --watch", - "lint": "pnpm lint:ts; pnpm lint:json", + "lint": "pnpm lint:ts; pnpm lint:md; pnpm lint:json", "lint:ts": "eslint --fix --cache '**/*.{js,ts,cjs,mjs,jsx,tsx}'; prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx}'", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "clean": "rm -rf dist", "prepublishOnly": "pnpm run build" @@ -52,17 +55,17 @@ "dependencies": { "@graphprotocol/address-book": "workspace:^", "@graphprotocol/interfaces": "workspace:^", - "@nomicfoundation/hardhat-ethers": "3.0.8", + "@nomicfoundation/hardhat-ethers": "catalog:", "debug": "^4.4.0", - "ethers": "6.13.7", + "ethers": "catalog:", "glob": "^11.0.1", - "hardhat": "^2.22.16", + "hardhat": "catalog:", "json5": "^2.2.3" }, "devDependencies": { "@types/debug": "^4.1.12", "@types/json5": "^2.2.0", - "eslint": "^8.56.0", - "typescript": "^5.0.0" + "eslint": "catalog:", + "typescript": "catalog:" } } diff --git a/packages/toolshed/src/deployments/horizon/address-book.ts b/packages/toolshed/src/deployments/horizon/address-book.ts index 8a3db914e..bb8d9a2aa 100644 --- a/packages/toolshed/src/deployments/horizon/address-book.ts +++ b/packages/toolshed/src/deployments/horizon/address-book.ts @@ -37,7 +37,11 @@ export class GraphHorizonAddressBook extends AddressBook=9.1.0' - version: 9.1.1 + version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 '@types/sinon-chai': specifier: ^3.2.12 version: 3.2.12 arbos-precompiles: specifier: ^1.0.2 - version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) chai: specifier: ^4.2.0 version: 4.5.0 @@ -188,20 +257,20 @@ importers: specifier: ^16.5.0 version: 16.6.1 eslint: - specifier: ^9.28.0 - version: 9.35.0(jiti@2.5.1) + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethereum-waffle: specifier: ^4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2) + version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: - specifier: ^5.7.0 + specifier: ^5.7.2 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: specifier: ^4.0.0 version: 4.0.4 glob: - specifier: ^8.0.3 - version: 8.1.0 + specifier: 'catalog:' + version: 11.0.3 graphql: specifier: ^16.11.0 version: 16.11.0 @@ -209,47 +278,44 @@ importers: specifier: ^2.12.4 version: 2.12.6(graphql@16.11.0) hardhat: - specifier: ^2.24.0 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: - specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: - specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-secure-accounts: - specifier: 0.0.6 - version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-storage-layout: - specifier: ^0.1.7 - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) + specifier: 'catalog:' + version: 6.0.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 winston: specifier: ^3.3.3 - version: 3.17.0 + version: 3.18.3 yaml: specifier: ^1.10.2 version: 1.10.2 @@ -264,7 +330,7 @@ importers: version: link:.. '@graphprotocol/sdk': specifier: 0.6.0 - version: 0.6.0(bufferutil@4.0.9)(encoding@0.1.13)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 0.6.0(bufferutil@4.0.9)(encoding@0.1.13)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) axios: specifier: ^1.9.0 version: 1.12.2(debug@4.4.3) @@ -295,13 +361,13 @@ importers: version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^3.4.1 version: 3.4.1 @@ -310,28 +376,28 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 - version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.2 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/glob': specifier: ^8.1.0 version: 8.1.0 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 arbos-precompiles: specifier: ^1.0.2 - version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) dotenv: specifier: ^16.5.0 version: 16.6.1 eslint: - specifier: ^9.28.0 - version: 9.35.0(jiti@2.5.1) + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -339,8 +405,8 @@ importers: specifier: ^4.0.0 version: 4.0.4 glob: - specifier: ^8.0.3 - version: 8.1.0 + specifier: 'catalog:' + version: 11.0.3 graphql: specifier: ^16.11.0 version: 16.11.0 @@ -348,49 +414,43 @@ importers: specifier: ^2.12.4 version: 2.12.6(graphql@16.11.0) hardhat: - specifier: ^2.24.0 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-secure-accounts: - specifier: 0.0.6 - version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-storage-layout: specifier: ^0.1.7 - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) - solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 winston: specifier: ^3.3.3 - version: 3.17.0 + version: 3.18.3 yaml: specifier: ^1.10.2 version: 1.10.2 yaml-lint: - specifier: ^1.7.0 + specifier: 'catalog:' version: 1.7.0 yargs: specifier: ^17.0.0 @@ -403,14 +463,14 @@ importers: version: link:.. '@graphprotocol/sdk': specifier: 0.6.0 - version: 0.6.0(bufferutil@4.0.9)(encoding@0.1.13)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 0.6.0(bufferutil@4.0.9)(encoding@0.1.13)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) devDependencies: '@arbitrum/sdk': specifier: ~3.1.13 version: 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@defi-wonderland/smock': specifier: ^2.4.1 - version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@ethersproject/abi': specifier: ^5.8.0 version: 5.8.0 @@ -431,16 +491,16 @@ importers: version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^3.4.1 version: 3.4.1 @@ -449,28 +509,28 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 - version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.2 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 9.1.1 + version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 '@types/sinon-chai': specifier: ^3.2.12 version: 3.2.12 arbos-precompiles: specifier: ^1.0.2 - version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) chai: specifier: ^4.2.0 version: 4.5.0 @@ -478,11 +538,11 @@ importers: specifier: ^16.5.0 version: 16.6.1 eslint: - specifier: ^9.28.0 - version: 9.35.0(jiti@2.5.1) + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethereum-waffle: specifier: ^4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2) + version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -490,8 +550,8 @@ importers: specifier: ^4.0.0 version: 4.0.4 glob: - specifier: ^8.0.3 - version: 8.1.0 + specifier: 'catalog:' + version: 11.0.3 graphql: specifier: ^16.11.0 version: 16.11.0 @@ -499,47 +559,41 @@ importers: specifier: ^2.12.4 version: 2.12.6(graphql@16.11.0) hardhat: - specifier: ^2.24.0 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-secure-accounts: - specifier: 0.0.6 - version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-storage-layout: specifier: ^0.1.7 - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) - solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 winston: specifier: ^3.3.3 - version: 3.17.0 + version: 3.18.3 yaml: specifier: ^1.10.2 version: 1.10.2 @@ -549,12 +603,6 @@ importers: packages/data-edge: devDependencies: - '@commitlint/cli': - specifier: ^16.2.1 - version: 16.3.0 - '@commitlint/config-conventional': - specifier: ^16.2.1 - version: 16.2.4 '@ethersproject/abi': specifier: ^5.7.0 version: 5.8.0 @@ -566,37 +614,37 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomiclabs/hardhat-ethers': specifier: ^2.0.2 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.2 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.1 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^4.5.0 version: 4.9.6 '@openzeppelin/hardhat-upgrades': specifier: ^1.8.2 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@tenderly/api-client': specifier: ^1.0.13 - version: 1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2) + version: 1.1.0(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3) '@tenderly/hardhat-tenderly': specifier: ^1.0.13 - version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.11.0(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@typechain/ethers-v5': specifier: ^10.2.1 - version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.6 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/mocha': specifier: ^9.0.0 version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 '@types/sinon-chai': specifier: ^3.2.12 version: 3.2.12 @@ -607,32 +655,32 @@ importers: specifier: ^16.0.0 version: 16.6.1 eslint: - specifier: ^9.28.0 - version: 9.35.0(jiti@2.5.1) + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethereum-waffle: specifier: ^3.0.2 - version: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) ethers: - specifier: ^5.7.0 + specifier: ^5.7.2 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethlint: specifier: ^1.2.5 version: 1.2.5(solium@1.2.5) hardhat: - specifier: ^2.24.0 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.2.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.3 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.4 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-secure-accounts: specifier: 0.0.6 - version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) husky: specifier: ^7.0.4 version: 7.0.4 @@ -646,29 +694,29 @@ importers: specifier: 0.45.0 version: 0.45.0 prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) + specifier: 'catalog:' + version: 6.0.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) truffle-flattener: specifier: ^1.4.4 version: 1.6.0 ts-node: specifier: '>=8.0.0' - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 packages/hardhat-graph-protocol: dependencies: @@ -676,8 +724,8 @@ importers: specifier: workspace:^ version: link:../toolshed '@nomicfoundation/hardhat-ethers': - specifier: 3.0.8 - version: 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.3.7 version: 4.4.3(supports-color@9.4.0) @@ -687,7 +735,7 @@ importers: devDependencies: '@nomicfoundation/hardhat-verify': specifier: ^2.0.12 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/chai': specifier: ^4.0.0 version: 4.3.20 @@ -701,32 +749,29 @@ importers: specifier: ^4.0.0 version: 4.5.0 eslint: - specifier: ^8.56.0 - version: 8.57.1 + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethers: - specifier: 6.13.7 - version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: - specifier: ^2.22.16 - version: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-secure-accounts: specifier: ^1.0.4 - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) mocha: specifier: ^10.8.2 version: 10.8.2 ts-node: specifier: ^8.0.0 - version: 8.10.2(typescript@5.9.2) + version: 8.10.2(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 packages/horizon: devDependencies: - '@defi-wonderland/natspec-smells': - specifier: ^1.1.6 - version: 1.1.6(typescript@5.9.2)(zod@3.25.76) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts @@ -738,28 +783,28 @@ importers: version: link:../toolshed '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.1.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': - specifier: 3.0.8 - version: 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.9 - version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.9 - version: 0.15.14(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(319f36fa853933d46d380da2276493de) + version: 4.0.0(6b332ee552128839aebadf34f365d923) '@nomicfoundation/hardhat-verify': specifier: ^2.0.10 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.9 version: 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -774,28 +819,28 @@ importers: version: 0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 9.1.1 + version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 chai: specifier: ^4.2.0 version: 4.5.0 eslint: - specifier: ^8.56.0 - version: 8.57.1 + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethers: - specifier: 6.13.7 - version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) forge-std: specifier: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 version: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 @@ -803,50 +848,47 @@ importers: specifier: ^11.0.1 version: 11.0.3 hardhat: - specifier: ^2.22.18 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-graph-protocol: specifier: workspace:^ version: link:../hardhat-graph-protocol hardhat-secure-accounts: specifier: ^1.0.5 - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) lint-staged: - specifier: ^15.2.2 - version: 15.5.2 + specifier: 'catalog:' + version: 16.2.3 prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) + specifier: 'catalog:' + version: 6.0.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 packages/interfaces: devDependencies: - '@defi-wonderland/natspec-smells': - specifier: ^1.1.6 - version: 1.1.6(typescript@5.9.2)(zod@3.25.76) '@ethersproject/abi': specifier: 5.7.0 version: 5.7.0 @@ -855,7 +897,7 @@ importers: version: 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(289f3c00e3d6307750c136f270e09d49) + version: 4.0.0(6b332ee552128839aebadf34f365d923) '@openzeppelin/contracts': specifier: 3.4.1 version: 3.4.1 @@ -864,43 +906,40 @@ importers: version: 3.4.2 '@typechain/ethers-v5': specifier: ^10.2.1 - version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@wagmi/cli': specifier: ^2.3.1 - version: 2.5.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 2.6.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) ethers: - specifier: 6.13.7 - version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethers-v5: specifier: npm:ethers@5.7.2 version: ethers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: - specifier: ^2.24.0 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) markdownlint-cli: - specifier: ^0.45.0 + specifier: 'catalog:' version: 0.45.0 prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) solhint: - specifier: 5.1.0 - version: 5.1.0(typescript@5.9.2) + specifier: 'catalog:' + version: 6.0.1(typescript@5.9.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) viem: specifier: ^2.31.7 - version: 2.37.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.37.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) packages/subgraph-service: devDependencies: - '@defi-wonderland/natspec-smells': - specifier: ^1.1.6 - version: 1.1.6(typescript@5.9.2)(zod@3.25.76) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts @@ -915,28 +954,28 @@ importers: version: link:../toolshed '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.1.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': - specifier: 3.0.8 - version: 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.9 - version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.9 - version: 0.15.14(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(319f36fa853933d46d380da2276493de) + version: 4.0.0(6b332ee552128839aebadf34f365d923) '@nomicfoundation/hardhat-verify': specifier: ^2.0.10 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.9 version: 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -951,28 +990,28 @@ importers: version: 0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1) '@typechain/ethers-v6': specifier: ^0.5.0 - version: 0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 9.1.1 + version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 chai: specifier: ^4.2.0 version: 4.5.0 eslint: - specifier: ^8.56.0 - version: 8.57.1 + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethers: - specifier: 6.13.7 - version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) forge-std: specifier: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 version: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 @@ -980,52 +1019,56 @@ importers: specifier: ^11.0.1 version: 11.0.3 hardhat: - specifier: ^2.22.18 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-graph-protocol: specifier: workspace:^ version: link:../hardhat-graph-protocol hardhat-secure-accounts: specifier: ^1.0.5 - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) json5: specifier: ^2.2.3 version: 2.2.3 lint-staged: - specifier: ^15.2.2 - version: 15.5.2 + specifier: 'catalog:' + version: 16.2.3 prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) + specifier: 'catalog:' + version: 6.0.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) solidity-docgen: specifier: ^0.6.0-beta.36 - version: 0.6.0-beta.36(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.6.0-beta.36(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 packages/token-distribution: + dependencies: + ajv: + specifier: ^8.17.1 + version: 8.17.1 devDependencies: '@ethersproject/abi': specifier: ^5.7.0 @@ -1044,22 +1087,22 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@graphprotocol/client-cli': specifier: ^2.2.22 - version: 2.2.22(@babel/core@7.28.4)(@envelop/core@5.3.1)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/merge@9.1.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 2.2.22(@babel/core@7.28.4)(@envelop/core@5.3.2)(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/store@0.104.13(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(@graphql-tools/merge@9.1.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@11.0.1(graphql@16.11.0))(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts '@graphql-yoga/plugin-persisted-operations': specifier: ^3.13.5 - version: 3.15.2(graphql-yoga@5.15.2(graphql@16.11.0))(graphql@16.11.0) + version: 3.16.0(graphql-yoga@5.16.0(graphql@16.11.0))(graphql@16.11.0) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^3.4.1 version: 3.4.1 @@ -1068,19 +1111,19 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 - version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.6 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/mocha': specifier: ^9.1.0 version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.19.14 + version: 20.19.19 '@types/sinon-chai': specifier: ^3.2.12 version: 3.2.12 @@ -1097,35 +1140,35 @@ importers: specifier: ^16.0.0 version: 16.6.1 eslint: - specifier: ^9.28.0 - version: 9.35.0(jiti@2.5.1) + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) ethereum-waffle: specifier: ^4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2) + version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: - specifier: ^5.7.0 + specifier: ^5.7.2 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) graphql: specifier: ^16.5.0 version: 16.11.0 graphql-yoga: specifier: ^5.13.4 - version: 5.15.2(graphql@16.11.0) + version: 5.16.0(graphql@16.11.0) hardhat: - specifier: ^2.24.0 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.0.1 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.1 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-deploy: specifier: ^0.7.0-beta.9 - version: 0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.1 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) inquirer: specifier: 8.0.0 version: 8.0.0 @@ -1139,29 +1182,29 @@ importers: specifier: ^6.6.2 version: 6.6.2 prettier: - specifier: ^3.5.3 + specifier: 'catalog:' version: 3.6.2 prettier-plugin-solidity: - specifier: ^2.0.0 + specifier: 'catalog:' version: 2.1.0(prettier@3.6.2) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.9.2) + specifier: 'catalog:' + version: 6.0.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + version: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 typescript-eslint: - specifier: ^8.33.1 - version: 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 'catalog:' + version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) packages/toolshed: dependencies: @@ -1172,20 +1215,20 @@ importers: specifier: workspace:^ version: link:../interfaces '@nomicfoundation/hardhat-ethers': - specifier: 3.0.8 - version: 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.4.0 version: 4.4.3(supports-color@9.4.0) ethers: - specifier: 6.13.7 - version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) glob: specifier: ^11.0.1 version: 11.0.3 hardhat: - specifier: ^2.22.16 - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + specifier: 'catalog:' + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) json5: specifier: ^2.2.3 version: 2.2.3 @@ -1197,19 +1240,19 @@ importers: specifier: ^2.2.0 version: 2.2.0 eslint: - specifier: ^8.56.0 - version: 8.57.1 + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) typescript: - specifier: ^5.8.3 - version: 5.9.2 + specifier: 'catalog:' + version: 5.9.3 packages: '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} '@arbitrum/sdk@3.1.13': resolution: {integrity: sha512-oE/j8ThWWEdFfV0helmR8lD0T67/CY1zMCt6RVslaCLrytFdbg3QsrHs/sQE3yiCXgisQlsx3qomCgh8PfBo8Q==} @@ -1254,91 +1297,91 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-lambda@3.888.0': - resolution: {integrity: sha512-5s3S+2E2jnyRnX/u5Dp4TCFANVcCKnUuvVLUc0jS9peUAPJLeE4ZfksC2XmWha3ZwInE/7XU2j7maPbM/BinkA==} + '@aws-sdk/client-lambda@3.901.0': + resolution: {integrity: sha512-4h6dgXKMGuK/hplMpdKbxQDtjy2laVoOO7Mml4/DPO6TVu8TIP6JQXo3SLCE6BUkqchZdXVKGtD7YCWsEBilcw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.888.0': - resolution: {integrity: sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==} + '@aws-sdk/client-sso@3.901.0': + resolution: {integrity: sha512-sGyDjjkJ7ppaE+bAKL/Q5IvVCxtoyBIzN+7+hWTS/mUxWJ9EOq9238IqmVIIK6sYNIzEf9yhobfMARasPYVTNg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.888.0': - resolution: {integrity: sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==} + '@aws-sdk/core@3.901.0': + resolution: {integrity: sha512-brKAc3y64tdhyuEf+OPIUln86bRTqkLgb9xkd6kUdIeA5+qmp/N6amItQz+RN4k4O3kqkCPYnAd3LonTKluobw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.888.0': - resolution: {integrity: sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==} + '@aws-sdk/credential-provider-env@3.901.0': + resolution: {integrity: sha512-5hAdVl3tBuARh3zX5MLJ1P/d+Kr5kXtDU3xm1pxUEF4xt2XkEEpwiX5fbkNkz2rbh3BCt2gOHsAbh6b3M7n+DA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.888.0': - resolution: {integrity: sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==} + '@aws-sdk/credential-provider-http@3.901.0': + resolution: {integrity: sha512-Ggr7+0M6QZEsrqRkK7iyJLf4LkIAacAxHz9c4dm9hnDdU7vqrlJm6g73IxMJXWN1bIV7IxfpzB11DsRrB/oNjQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.888.0': - resolution: {integrity: sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==} + '@aws-sdk/credential-provider-ini@3.901.0': + resolution: {integrity: sha512-zxadcDS0hNJgv8n4hFYJNOXyfjaNE1vvqIiF/JzZSQpSSYXzCd+WxXef5bQh+W3giDtRUmkvP5JLbamEFjZKyw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.888.0': - resolution: {integrity: sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==} + '@aws-sdk/credential-provider-node@3.901.0': + resolution: {integrity: sha512-dPuFzMF7L1s/lQyT3wDxqLe82PyTH+5o1jdfseTEln64LJMl0ZMWaKX/C1UFNDxaTd35Cgt1bDbjjAWHMiKSFQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.888.0': - resolution: {integrity: sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==} + '@aws-sdk/credential-provider-process@3.901.0': + resolution: {integrity: sha512-/IWgmgM3Cl1wTdJA5HqKMAojxLkYchh5kDuphApxKhupLu6Pu0JBOHU8A5GGeFvOycyaVwosod6zDduINZxe+A==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.888.0': - resolution: {integrity: sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==} + '@aws-sdk/credential-provider-sso@3.901.0': + resolution: {integrity: sha512-SjmqZQHmqFSET7+6xcZgtH7yEyh5q53LN87GqwYlJZ6KJ5oNw11acUNEhUOL1xTSJEvaWqwTIkS2zqrzLcM9bw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.888.0': - resolution: {integrity: sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==} + '@aws-sdk/credential-provider-web-identity@3.901.0': + resolution: {integrity: sha512-NYjy/6NLxH9m01+pfpB4ql8QgAorJcu8tw69kzHwUd/ql6wUDTbC7HcXqtKlIwWjzjgj2BKL7j6SyFapgCuafA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.887.0': - resolution: {integrity: sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==} + '@aws-sdk/middleware-host-header@3.901.0': + resolution: {integrity: sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.887.0': - resolution: {integrity: sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==} + '@aws-sdk/middleware-logger@3.901.0': + resolution: {integrity: sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.887.0': - resolution: {integrity: sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==} + '@aws-sdk/middleware-recursion-detection@3.901.0': + resolution: {integrity: sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.888.0': - resolution: {integrity: sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==} + '@aws-sdk/middleware-user-agent@3.901.0': + resolution: {integrity: sha512-Zby4F03fvD9xAgXGPywyk4bC1jCbnyubMEYChLYohD+x20ULQCf+AimF/Btn7YL+hBpzh1+RmqmvZcx+RgwgNQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.888.0': - resolution: {integrity: sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==} + '@aws-sdk/nested-clients@3.901.0': + resolution: {integrity: sha512-feAAAMsVwctk2Tms40ONybvpfJPLCmSdI+G+OTrNpizkGLNl6ik2Ng2RzxY6UqOfN8abqKP/DOUj1qYDRDG8ag==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.887.0': - resolution: {integrity: sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==} + '@aws-sdk/region-config-resolver@3.901.0': + resolution: {integrity: sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.888.0': - resolution: {integrity: sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==} + '@aws-sdk/token-providers@3.901.0': + resolution: {integrity: sha512-pJEr1Ggbc/uVTDqp9IbNu9hdr0eQf3yZix3s4Nnyvmg4xmJSGAlbPC9LrNr5u3CDZoc8Z9CuLrvbP4MwYquNpQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.887.0': - resolution: {integrity: sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==} + '@aws-sdk/types@3.901.0': + resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.887.0': - resolution: {integrity: sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==} + '@aws-sdk/util-endpoints@3.901.0': + resolution: {integrity: sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.873.0': - resolution: {integrity: sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==} + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.887.0': - resolution: {integrity: sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==} + '@aws-sdk/util-user-agent-browser@3.901.0': + resolution: {integrity: sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==} - '@aws-sdk/util-user-agent-node@3.888.0': - resolution: {integrity: sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==} + '@aws-sdk/util-user-agent-node@3.901.0': + resolution: {integrity: sha512-l59KQP5TY7vPVUfEURc7P5BJKuNg1RSsAKBQW7LHLECXjLqDUbo2SMLrexLBEoArSt6E8QOrIN0C8z/0Xk0jYw==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1349,8 +1392,8 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.887.0': - resolution: {integrity: sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==} + '@aws-sdk/xml-builder@3.901.0': + resolution: {integrity: sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==} engines: {node: '>=18.0.0'} '@aws/lambda-invoke-store@0.0.1': @@ -1760,154 +1803,81 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} - '@commitlint/cli@16.3.0': - resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} - engines: {node: '>=v12'} - hasBin: true - - '@commitlint/cli@19.8.1': - resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} + '@commitlint/cli@20.1.0': + resolution: {integrity: sha512-pW5ujjrOovhq5RcYv5xCpb4GkZxkO2+GtOdBW2/qrr0Ll9tl3PX0aBBobGQl3mdZUbOBgwAexEQLeH6uxL0VYg==} engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@16.2.4': - resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} - engines: {node: '>=v12'} - - '@commitlint/config-conventional@19.8.1': - resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==} + '@commitlint/config-conventional@20.0.0': + resolution: {integrity: sha512-q7JroPIkDBtyOkVe9Bca0p7kAUYxZMxkrBArCfuD3yN4KjRAenP9PmYwnn7rsw8Q+hHq1QB2BRmBh0/Z19ZoJw==} engines: {node: '>=v18'} - '@commitlint/config-validator@16.2.1': - resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} - engines: {node: '>=v12'} - - '@commitlint/config-validator@19.8.1': - resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} + '@commitlint/config-validator@20.0.0': + resolution: {integrity: sha512-BeyLMaRIJDdroJuYM2EGhDMGwVBMZna9UiIqV9hxj+J551Ctc6yoGuGSmghOy/qPhBSuhA6oMtbEiTmxECafsg==} engines: {node: '>=v18'} - '@commitlint/ensure@16.2.1': - resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} - engines: {node: '>=v12'} - - '@commitlint/ensure@19.8.1': - resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==} + '@commitlint/ensure@20.0.0': + resolution: {integrity: sha512-WBV47Fffvabe68n+13HJNFBqiMH5U1Ryls4W3ieGwPC0C7kJqp3OVQQzG2GXqOALmzrgAB+7GXmyy8N9ct8/Fg==} engines: {node: '>=v18'} - '@commitlint/execute-rule@16.2.1': - resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} - engines: {node: '>=v12'} - - '@commitlint/execute-rule@19.8.1': - resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} + '@commitlint/execute-rule@20.0.0': + resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} engines: {node: '>=v18'} - '@commitlint/format@16.2.1': - resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} - engines: {node: '>=v12'} - - '@commitlint/format@19.8.1': - resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==} + '@commitlint/format@20.0.0': + resolution: {integrity: sha512-zrZQXUcSDmQ4eGGrd+gFESiX0Rw+WFJk7nW4VFOmxub4mAATNKBQ4vNw5FgMCVehLUKG2OT2LjOqD0Hk8HvcRg==} engines: {node: '>=v18'} - '@commitlint/is-ignored@16.2.4': - resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} - engines: {node: '>=v12'} - - '@commitlint/is-ignored@19.8.1': - resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==} + '@commitlint/is-ignored@20.0.0': + resolution: {integrity: sha512-ayPLicsqqGAphYIQwh9LdAYOVAQ9Oe5QCgTNTj+BfxZb9b/JW222V5taPoIBzYnAP0z9EfUtljgBk+0BN4T4Cw==} engines: {node: '>=v18'} - '@commitlint/lint@16.2.4': - resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} - engines: {node: '>=v12'} - - '@commitlint/lint@19.8.1': - resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==} + '@commitlint/lint@20.0.0': + resolution: {integrity: sha512-kWrX8SfWk4+4nCexfLaQT3f3EcNjJwJBsSZ5rMBw6JCd6OzXufFHgel2Curos4LKIxwec9WSvs2YUD87rXlxNQ==} engines: {node: '>=v18'} - '@commitlint/load@16.3.0': - resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} - engines: {node: '>=v12'} - - '@commitlint/load@19.8.1': - resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} + '@commitlint/load@20.1.0': + resolution: {integrity: sha512-qo9ER0XiAimATQR5QhvvzePfeDfApi/AFlC1G+YN+ZAY8/Ua6IRrDrxRvQAr+YXUKAxUsTDSp9KXeXLBPsNRWg==} engines: {node: '>=v18'} - '@commitlint/message@16.2.1': - resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} - engines: {node: '>=v12'} - - '@commitlint/message@19.8.1': - resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==} + '@commitlint/message@20.0.0': + resolution: {integrity: sha512-gLX4YmKnZqSwkmSB9OckQUrI5VyXEYiv3J5JKZRxIp8jOQsWjZgHSG/OgEfMQBK9ibdclEdAyIPYggwXoFGXjQ==} engines: {node: '>=v18'} - '@commitlint/parse@16.2.1': - resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} - engines: {node: '>=v12'} - - '@commitlint/parse@19.8.1': - resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} + '@commitlint/parse@20.0.0': + resolution: {integrity: sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==} engines: {node: '>=v18'} - '@commitlint/read@16.2.1': - resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} - engines: {node: '>=v12'} - - '@commitlint/read@19.8.1': - resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==} + '@commitlint/read@20.0.0': + resolution: {integrity: sha512-Ti7Y7aEgxsM1nkwA4ZIJczkTFRX/+USMjNrL9NXwWQHqNqrBX2iMi+zfuzZXqfZ327WXBjdkRaytJ+z5vNqTOA==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@16.2.1': - resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} - engines: {node: '>=v12'} - - '@commitlint/resolve-extends@19.8.1': - resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} + '@commitlint/resolve-extends@20.1.0': + resolution: {integrity: sha512-cxKXQrqHjZT3o+XPdqDCwOWVFQiae++uwd9dUBC7f2MdV58ons3uUvASdW7m55eat5sRiQ6xUHyMWMRm6atZWw==} engines: {node: '>=v18'} - '@commitlint/rules@16.2.4': - resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} - engines: {node: '>=v12'} - - '@commitlint/rules@19.8.1': - resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==} + '@commitlint/rules@20.0.0': + resolution: {integrity: sha512-gvg2k10I/RfvHn5I5sxvVZKM1fl72Sqrv2YY/BnM7lMHcYqO0E2jnRWoYguvBfEcZ39t+rbATlciggVe77E4zA==} engines: {node: '>=v18'} - '@commitlint/to-lines@16.2.1': - resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} - engines: {node: '>=v12'} - - '@commitlint/to-lines@19.8.1': - resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==} + '@commitlint/to-lines@20.0.0': + resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} engines: {node: '>=v18'} - '@commitlint/top-level@16.2.1': - resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} - engines: {node: '>=v12'} - - '@commitlint/top-level@19.8.1': - resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==} + '@commitlint/top-level@20.0.0': + resolution: {integrity: sha512-drXaPSP2EcopukrUXvUXmsQMu3Ey/FuJDc/5oiW4heoCfoE5BdLQyuc7veGeE3aoQaTVqZnh4D5WTWe2vefYKg==} engines: {node: '>=v18'} - '@commitlint/types@16.2.1': - resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} - engines: {node: '>=v12'} - - '@commitlint/types@19.8.1': - resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} + '@commitlint/types@20.0.0': + resolution: {integrity: sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==} engines: {node: '>=v18'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@defi-wonderland/natspec-smells@1.1.6': - resolution: {integrity: sha512-HTdZLEdBs3UakW0JQZ7vO8pb6YCoU3CPQNfLxa0Z9PWAwmgKhSZJbF8dm/okkJEJGRa0dCoOxviJw5jeK+kDiQ==} - hasBin: true + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} '@defi-wonderland/smock@2.4.1': resolution: {integrity: sha512-SvWg0joZppEWEB1XopkJazH1+whLw48KgwYLblml0Y7meJLK+J33uuPNtEsmAwgXWCCt6CouK2fXtSEDz2zKVw==} @@ -1931,8 +1901,8 @@ packages: '@envelop/core@3.0.6': resolution: {integrity: sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig==} - '@envelop/core@5.3.1': - resolution: {integrity: sha512-n29V3vRqXvPcG76C8zE482LQykk0P66zv1mjpk7aHeGe9qnh8AzB/RvoX5SVFwApJQPp0ixob8NoYXg4FHKMGA==} + '@envelop/core@5.3.2': + resolution: {integrity: sha512-06Mu7fmyKzk09P2i2kHpGfItqLLgCq7uO5/nX4fc/iHMplWPNuAx4iYR+WXUQoFHDnP6EUbceQNQ5iyeMz9f3g==} engines: {node: '>=18.0.0'} '@envelop/extended-validation@2.0.6': @@ -1958,162 +1928,158 @@ packages: '@envelop/core': ^3.0.6 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@es-joy/jsdoccomment@0.50.2': - resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} - engines: {node: '>=18'} - - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2132,36 +2098,28 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@9.35.0': - resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ethereum-waffle/chai@3.4.4': @@ -2706,11 +2664,29 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-hive/pubsub@2.0.0-next-38d601a82253147a4bfe657c7eee418d25c183b6': + resolution: {integrity: sha512-A1514UqRwmdyT9hGrLtD9TdD/5ffhjxnV+baUmCii+B0gsGD7LkYXBuwk+jdWZjADXKiBZWY1qOM21WNA0QI4w==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@nats-io/nats-core': ^3 + ioredis: ^5 + peerDependenciesMeta: + '@nats-io/nats-core': + optional: true + ioredis: + optional: true + '@graphql-inspector/core@3.3.0': resolution: {integrity: sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg==} peerDependencies: graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-inspector/core@6.2.1': + resolution: {integrity: sha512-PxL3fNblfKx/h/B4MIXN1yGHsGdY+uuySz8MAy/ogDk7eU1+va2zDZicLMEBHf7nsKfHWCAN1WFtD1GQP824NQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + '@graphql-mesh/cache-localforage@0.93.1': resolution: {integrity: sha512-cY/LJ+XC8kiyPoLxqPAMlOAvaeB81CZafdadLNyNDFuu66qDiZqWTYPw/lnhp2nyeukC8o/P69oP7d2OqVaCZA==} peerDependencies: @@ -2743,6 +2719,12 @@ packages: '@graphql-tools/utils': ^9.2.1 graphql: '*' + '@graphql-mesh/cross-helpers@0.4.10': + resolution: {integrity: sha512-7xmYM4P3UCmhx1pqU3DY4xWNydMBSXdzlHJ2wQPoM/s+l7tuWhxdtvmFmy12VkvZYtMAHkCpYvQokscWctUyrA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: '*' + '@graphql-mesh/graphql@0.93.1': resolution: {integrity: sha512-1G2/1jkl1VPWhsZsUBwFQI5d9OxxEc+CMxy5ef0qI2WEXqIocOxMhEY53cc+tCSbuXR99rxos+KD/8Z6ZasaOQ==} peerDependencies: @@ -2793,6 +2775,12 @@ packages: graphql: '*' tslib: ^2.4.0 + '@graphql-mesh/store@0.104.13': + resolution: {integrity: sha512-IPcsE5BG6SsPbTUf6C18JdSWpGVWasa0D8mZJYxACFIj8wF+cdA2z9xblgXcPtn0hRe+vuG/pDdRUJREEBKa6Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: '*' + '@graphql-mesh/store@0.93.1': resolution: {integrity: sha512-OEljVuaZn2htU1rt4Yll/aJmynw3/Kvhd6eE8V0/del0u9iuLJqiKkzFJl8HUSMh0IkO10OnficJnTM0tCmxRw==} peerDependencies: @@ -2809,6 +2797,12 @@ packages: graphql: '*' tslib: ^2.4.0 + '@graphql-mesh/string-interpolation@0.5.9': + resolution: {integrity: sha512-UHDsee3a9hBctZjB56B6sajxWFX56lLPlhtEYrQ06xq3gyFpb9bD45xi69ltPxbpHXmZrmNNDNLb/Ft173JQfg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: '*' + '@graphql-mesh/transform-type-merging@0.93.1': resolution: {integrity: sha512-CUrqCMaEqO1LDusv59UPqmQju3f+LpEGxFu7CydMiIvbfKDDDrf8+dF3OVU7d/ZOMRxB6hR80JsQF0SVeXPCOQ==} peerDependencies: @@ -2817,6 +2811,12 @@ packages: graphql: '*' tslib: ^2.4.0 + '@graphql-mesh/types@0.104.13': + resolution: {integrity: sha512-2D/h78FykbYXWHxN2cOGj6aZvO4HRg62yMbzBC5oeAWt1QML+BULRg6DwLimRpnIBmuRrd+Wlvi6NQtPnWeJ+g==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: '*' + '@graphql-mesh/types@0.93.2': resolution: {integrity: sha512-113DuJzmR7aj2EMnLPu33ktCe5k7+Mk0BxFfmQViUH+mkr6i4JMsWvPKs9dTODSYuSuwvAZ90Vw2l3QyMrbFVA==} peerDependencies: @@ -2825,6 +2825,12 @@ packages: graphql: '*' tslib: ^2.4.0 + '@graphql-mesh/utils@0.104.13': + resolution: {integrity: sha512-Ga0ao4/HXr48Qy+cgEwRftafFtvHIk35Lo+aD0cptO/QMtC8U61C2KUgnrJYmiL+Ei1uVtb5hN8LrUSUM+nrig==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: '*' + '@graphql-mesh/utils@0.93.2': resolution: {integrity: sha512-U+VytfSoqPofH/pmYZHFY10SkIFtHKrvE7Isxv1d0DiweVjdH3Qtojw13DWFpu/EKtgJY5bqoVnlcsZJYlKQoA==} peerDependencies: @@ -2834,11 +2840,23 @@ packages: graphql: '*' tslib: ^2.4.0 + '@graphql-tools/batch-delegate@10.0.1': + resolution: {integrity: sha512-LmC+ddeChk8BsROadqpyoXnaFShNK+y4ZJW62AztMmHUgWBhs86O382sW2L75zOUmCqIKBHmctG13+60SgN8bQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/batch-delegate@8.4.27': resolution: {integrity: sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/batch-execute@10.0.1': + resolution: {integrity: sha512-MP1odlfq5NZkJylzoeMCbWHqOs58uyxUYOT5L5yb9NTFOCuFj+GUPV5HSX6Hi5vuXPSFfdIe0ypSOoywimRnUg==} + engines: {node: '>=20.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/batch-execute@8.5.22': resolution: {integrity: sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==} peerDependencies: @@ -2849,6 +2867,12 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/delegate@11.0.1': + resolution: {integrity: sha512-S1g4mb6LG6BIfBEUffA6WtVK9E+oilr4hsHz2edd2vg2AOqZDFGDwp7seBgEtG7xLRG5TyqB8B93i3M03rGWFA==} + engines: {node: '>=20.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/delegate@9.0.35': resolution: {integrity: sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==} peerDependencies: @@ -2968,6 +2992,12 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/wrap@11.0.1': + resolution: {integrity: sha512-V08Vnvt1xhdtDzmyZ9i14mLKREnrGupOTWQSd4tERrJP6HdiMATjk65Ht+ppRSbwDpqVroyR3szitZhnAV2gRw==} + engines: {node: '>=20.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/wrap@9.4.2': resolution: {integrity: sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==} peerDependencies: @@ -2985,12 +3015,12 @@ packages: resolution: {integrity: sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA==} engines: {node: '>=18.0.0'} - '@graphql-yoga/plugin-persisted-operations@3.15.2': - resolution: {integrity: sha512-Vgn1rZPTaiWsolpQt9ygjUEHyOiPBvvp3ovkEvWmt+Cqps7KlL7pjJU3uE57JZlBHblIWmUmdM4Ec9F/ahZjOw==} + '@graphql-yoga/plugin-persisted-operations@3.16.0': + resolution: {integrity: sha512-07kOQlV6Bq/Dh0cmNEhn07OSgduswaJUZfsYKw/aaScsrUhJUOEkTUcEqjQENqpRusNXW2ni42CaZcytxHp4iA==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^15.2.0 || ^16.0.0 - graphql-yoga: ^5.15.2 + graphql-yoga: ^5.16.0 '@graphql-yoga/subscription@3.1.0': resolution: {integrity: sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==} @@ -3014,18 +3044,13 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} @@ -3261,11 +3286,11 @@ packages: ethers: ^6.14.0 hardhat: ^2.26.0 - '@nomicfoundation/hardhat-ethers@3.0.8': - resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} + '@nomicfoundation/hardhat-ethers@3.1.0': + resolution: {integrity: sha512-jx6fw3Ms7QBwFGT2MU6ICG292z0P81u6g54JjSV105+FbTZOF4FJqPksLfDybxkkOeq28eDxbqq7vpxRYyIlxA==} peerDependencies: - ethers: ^6.1.0 - hardhat: ^2.0.0 + ethers: ^6.14.0 + hardhat: ^2.26.0 '@nomicfoundation/hardhat-foundry@1.2.0': resolution: {integrity: sha512-2AJQLcWnUk/iQqHDVnyOadASKFQKF1PhNtt1cONEQqzUPK+fqME1IbP+EKu+RkZTRcyc4xqUMaB0sutglKRITg==} @@ -3311,7 +3336,7 @@ packages: solidity-coverage: ^0.8.1 ts-node: '>=8.0.0' typechain: ^8.3.0 - typescript: ^5.8.3 + typescript: '>=4.5.0' '@nomicfoundation/hardhat-verify@2.1.1': resolution: {integrity: sha512-K1plXIS42xSHDJZRkrE2TZikqxp9T4y6jUMUNI/imLgN5uCcEQokmfU0DlyP9zzHncYK92HlT5IWP35UVCLrPw==} @@ -3471,10 +3496,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -3645,198 +3666,205 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.1.1': - resolution: {integrity: sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==} + '@smithy/abort-controller@4.2.0': + resolution: {integrity: sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.2.2': - resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} + '@smithy/config-resolver@4.3.0': + resolution: {integrity: sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.11.0': - resolution: {integrity: sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==} + '@smithy/core@3.14.0': + resolution: {integrity: sha512-XJ4z5FxvY/t0Dibms/+gLJrI5niRoY0BCmE02fwmPcRYFPI4KI876xaE79YGWIKnEslMbuQPsIEsoU/DXa0DoA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.1.2': - resolution: {integrity: sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==} + '@smithy/credential-provider-imds@4.2.0': + resolution: {integrity: sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.1.1': - resolution: {integrity: sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==} + '@smithy/eventstream-codec@4.2.0': + resolution: {integrity: sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.1.1': - resolution: {integrity: sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA==} + '@smithy/eventstream-serde-browser@4.2.0': + resolution: {integrity: sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.2.1': - resolution: {integrity: sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw==} + '@smithy/eventstream-serde-config-resolver@4.3.0': + resolution: {integrity: sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.1.1': - resolution: {integrity: sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==} + '@smithy/eventstream-serde-node@4.2.0': + resolution: {integrity: sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.1.1': - resolution: {integrity: sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA==} + '@smithy/eventstream-serde-universal@4.2.0': + resolution: {integrity: sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.2.1': - resolution: {integrity: sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==} + '@smithy/fetch-http-handler@5.3.0': + resolution: {integrity: sha512-BG3KSmsx9A//KyIfw+sqNmWFr1YBUr+TwpxFT7yPqAk0yyDh7oSNgzfNH7pS6OC099EGx2ltOULvumCFe8bcgw==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.1.1': - resolution: {integrity: sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==} + '@smithy/hash-node@4.2.0': + resolution: {integrity: sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.1.1': - resolution: {integrity: sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==} + '@smithy/invalid-dependency@4.2.0': + resolution: {integrity: sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.1.0': - resolution: {integrity: sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==} + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.1.1': - resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} + '@smithy/middleware-content-length@4.2.0': + resolution: {integrity: sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.2.2': - resolution: {integrity: sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==} + '@smithy/middleware-endpoint@4.3.0': + resolution: {integrity: sha512-jFVjuQeV8TkxaRlcCNg0GFVgg98tscsmIrIwRFeC74TIUyLE3jmY9xgc1WXrPQYRjQNK3aRoaIk6fhFRGOIoGw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.2.2': - resolution: {integrity: sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==} + '@smithy/middleware-retry@4.4.0': + resolution: {integrity: sha512-yaVBR0vQnOnzex45zZ8ZrPzUnX73eUC8kVFaAAbn04+6V7lPtxn56vZEBBAhgS/eqD6Zm86o6sJs6FuQVoX5qg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.1.1': - resolution: {integrity: sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==} + '@smithy/middleware-serde@4.2.0': + resolution: {integrity: sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.1.1': - resolution: {integrity: sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==} + '@smithy/middleware-stack@4.2.0': + resolution: {integrity: sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.2.2': - resolution: {integrity: sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==} + '@smithy/node-config-provider@4.3.0': + resolution: {integrity: sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.2.1': - resolution: {integrity: sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==} + '@smithy/node-http-handler@4.3.0': + resolution: {integrity: sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.1.1': - resolution: {integrity: sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==} + '@smithy/property-provider@4.2.0': + resolution: {integrity: sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.2.1': - resolution: {integrity: sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==} + '@smithy/protocol-http@5.3.0': + resolution: {integrity: sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.1.1': - resolution: {integrity: sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==} + '@smithy/querystring-builder@4.2.0': + resolution: {integrity: sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.1.1': - resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} + '@smithy/querystring-parser@4.2.0': + resolution: {integrity: sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.1.1': - resolution: {integrity: sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==} + '@smithy/service-error-classification@4.2.0': + resolution: {integrity: sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.2.0': - resolution: {integrity: sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==} + '@smithy/shared-ini-file-loader@4.3.0': + resolution: {integrity: sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.2.1': - resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} + '@smithy/signature-v4@5.3.0': + resolution: {integrity: sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.6.2': - resolution: {integrity: sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==} + '@smithy/smithy-client@4.7.0': + resolution: {integrity: sha512-3BDx/aCCPf+kkinYf5QQhdQ9UAGihgOVqI3QO5xQfSaIWvUE4KYLtiGRWsNe1SR7ijXC0QEPqofVp5Sb0zC8xQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.5.0': - resolution: {integrity: sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==} + '@smithy/types@4.6.0': + resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.1.1': - resolution: {integrity: sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==} + '@smithy/url-parser@4.2.0': + resolution: {integrity: sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.1.0': - resolution: {integrity: sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==} + '@smithy/util-base64@4.2.0': + resolution: {integrity: sha512-+erInz8WDv5KPe7xCsJCp+1WCjSbah9gWcmUXc9NqmhyPx59tf7jqFz+za1tRG1Y5KM1Cy1rWCcGypylFp4mvA==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.1.0': - resolution: {integrity: sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==} + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.1.0': - resolution: {integrity: sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==} + '@smithy/util-body-length-node@4.2.0': + resolution: {integrity: sha512-U8q1WsSZFjXijlD7a4wsDQOvOwV+72iHSfq1q7VD+V75xP/pdtm0WIGuaFJ3gcADDOKj2MIBn4+zisi140HEnQ==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.1.0': - resolution: {integrity: sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==} + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.1.0': - resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.1.2': - resolution: {integrity: sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==} + '@smithy/util-defaults-mode-browser@4.2.0': + resolution: {integrity: sha512-qzHp7ZDk1Ba4LDwQVCNp90xPGqSu7kmL7y5toBpccuhi3AH7dcVBIT/pUxYcInK4jOy6FikrcTGq5wxcka8UaQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.1.2': - resolution: {integrity: sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==} + '@smithy/util-defaults-mode-node@4.2.0': + resolution: {integrity: sha512-FxUHS3WXgx3bTWR6yQHNHHkQHZm/XKIi/CchTnKvBulN6obWpcbzJ6lDToXn+Wp0QlVKd7uYAz2/CTw1j7m+Kg==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.1.2': - resolution: {integrity: sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==} + '@smithy/util-endpoints@3.2.0': + resolution: {integrity: sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.1.0': - resolution: {integrity: sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==} + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.1.1': - resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} + '@smithy/util-middleware@4.2.0': + resolution: {integrity: sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.1.1': - resolution: {integrity: sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==} + '@smithy/util-retry@4.2.0': + resolution: {integrity: sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.3.1': - resolution: {integrity: sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==} + '@smithy/util-stream@4.4.0': + resolution: {integrity: sha512-vtO7ktbixEcrVzMRmpQDnw/Ehr9UWjBvSJ9fyAbadKkC4w5Cm/4lMO8cHz8Ysb8uflvQUNRcuux/oNHKPXkffg==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.1.0': - resolution: {integrity: sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==} + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.1.0': - resolution: {integrity: sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==} + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.0': + resolution: {integrity: sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.1.1': - resolution: {integrity: sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==} + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} @@ -3859,7 +3887,7 @@ packages: resolution: {integrity: sha512-kyye7TQ+RbDbJ7bSUjNf/O9fTtRYNUDIEUZQSrmNonowMw5/EpNi664eWaOoC00NEzxgttVrtme/GHvIOu7rNg==} peerDependencies: ts-node: '*' - typescript: ^5.8.3 + typescript: '*' peerDependenciesMeta: ts-node: optional: true @@ -3897,7 +3925,7 @@ packages: '@ethersproject/providers': ^5.0.0 ethers: ^5.1.3 typechain: ^8.1.1 - typescript: ^5.8.3 + typescript: '>=4.3.0' '@typechain/ethers-v5@2.0.0': resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} @@ -3910,7 +3938,7 @@ packages: peerDependencies: ethers: 6.x typechain: ^8.3.2 - typescript: ^5.8.3 + typescript: '>=4.7.0' '@typechain/hardhat@6.1.6': resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} @@ -4018,9 +4046,6 @@ packages: '@types/levelup@4.3.3': resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -4028,9 +4053,6 @@ packages: resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/mkdirp@0.5.2': resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} @@ -4046,14 +4068,8 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@20.19.14': - resolution: {integrity: sha512-gqiKWld3YIkmtrrg9zDvg9jfksZCcPywXVN7IauUGhilwGV/yOyeUsvpR796m/Jye0zUzMXPKe8Ct1B79A7N5Q==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/node@20.19.19': + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} @@ -4070,8 +4086,8 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/secp256k1@4.0.6': - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + '@types/secp256k1@4.0.7': + resolution: {integrity: sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==} '@types/sinon-chai@3.2.12': resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} @@ -4091,9 +4107,6 @@ packages: '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.15.3': resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==} @@ -4106,68 +4119,65 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.44.0': - resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==} + '@typescript-eslint/eslint-plugin@8.45.0': + resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.44.0 + '@typescript-eslint/parser': ^8.45.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.44.0': - resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} + '@typescript-eslint/parser@8.45.0': + resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.44.0': - resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} + '@typescript-eslint/project-service@8.45.0': + resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.44.0': - resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} + '@typescript-eslint/scope-manager@8.45.0': + resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.44.0': - resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} + '@typescript-eslint/tsconfig-utils@8.45.0': + resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.44.0': - resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} + '@typescript-eslint/type-utils@8.45.0': + resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.44.0': - resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} + '@typescript-eslint/types@8.45.0': + resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.44.0': - resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} + '@typescript-eslint/typescript-estree@8.45.0': + resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.44.0': - resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} + '@typescript-eslint/utils@8.45.0': + resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.44.0': - resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} + '@typescript-eslint/visitor-keys@8.45.0': + resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@urql/core@2.4.4': resolution: {integrity: sha512-TD+OS7jG1Ts6QkpU0TZ85i/vu40r71GF0QQFDhnWFtgkHcNwnpkIwWBMa72AR3j2imBTPpk61e/xb39uM/t37A==} peerDependencies: @@ -4188,11 +4198,11 @@ packages: peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@wagmi/cli@2.5.1': - resolution: {integrity: sha512-X8cFOy9CtVZOiixqW+Y8/EbL91MLWfzV1Wd+M88LErxLBtP8K0Z4P6lS8I5nrH64zm5dC2ZN9SlrZMSbwQqbOQ==} + '@wagmi/cli@2.6.0': + resolution: {integrity: sha512-Dn1OS9CylYe46OU7gXXn7LXNCrzH/gPUU2FgrQ07BXVd4UhtAMPjr1HKGH37Ei/Vp0Ys8mv1B8LGHDg4BFKQow==} hasBin: true peerDependencies: - typescript: ^5.8.3 + typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true @@ -4214,8 +4224,8 @@ packages: resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==} engines: {node: '>=18.0.0'} - '@whatwg-node/fetch@0.10.10': - resolution: {integrity: sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==} + '@whatwg-node/fetch@0.10.11': + resolution: {integrity: sha512-eR8SYtf9Nem1Tnl0IWrY33qJ5wCtIWlt3Fs3c6V4aAaTFLtkEQErXu3SSZg/XCHrj9hXSJ8/8t+CdMk5Qec/ZA==} engines: {node: '>=18.0.0'} '@whatwg-node/fetch@0.8.8': @@ -4224,8 +4234,8 @@ packages: '@whatwg-node/node-fetch@0.3.6': resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} - '@whatwg-node/node-fetch@0.7.25': - resolution: {integrity: sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==} + '@whatwg-node/node-fetch@0.8.0': + resolution: {integrity: sha512-+z00GpWxKV/q8eMETwbdi80TcOoVEVZ4xSRkxYOZpn3kbV3nej5iViNzXVke/j3v4y1YpO5zMS/CVDIASvJnZQ==} engines: {node: '>=18.0.0'} '@whatwg-node/promise-helpers@1.3.2': @@ -4249,19 +4259,21 @@ packages: abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - abitype@0.7.1: - resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} peerDependencies: - typescript: ^5.8.3 - zod: ^3 >=3.19.1 + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: + typescript: + optional: true zod: optional: true - abitype@1.1.0: - resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} + abitype@1.1.1: + resolution: {integrity: sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q==} peerDependencies: - typescript: ^5.8.3 + typescript: '>=5.0.4' zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: @@ -4344,6 +4356,11 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv-errors@1.0.1: + resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + peerDependencies: + ajv: '>=5.0.0' + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -4382,8 +4399,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.1.0: - resolution: {integrity: sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==} + ansi-escapes@7.1.1: + resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} ansi-regex@2.1.1: @@ -4447,10 +4464,6 @@ packages: resolution: {integrity: sha512-1dOFYFJUN0kKoofh6buZJ8qCqTs+oLGSsGzHI0trA/Pka/TCERflCRsNVxez2lihOvK7MT/a2RA8AepKtBXdPQ==} deprecated: This package is no longer maintained, instead look into @arbitrum/nitro-contracts - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - are-we-there-yet@1.1.7: resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} deprecated: This package is no longer supported. @@ -4546,10 +4559,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -4606,9 +4615,6 @@ packages: async@2.6.2: resolution: {integrity: sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==} - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -4873,8 +4879,8 @@ packages: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} - baseline-browser-mapping@2.8.4: - resolution: {integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==} + baseline-browser-mapping@2.8.12: + resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} hasBin: true basic-auth@2.0.1: @@ -4887,6 +4893,12 @@ packages: bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + better-ajv-errors@2.0.2: + resolution: {integrity: sha512-1cLrJXEq46n0hjV8dDYwg9LKYjDb3KbeW7nZTv4kvfoDD9c2DXHIE31nxM+Y/cIfXMggLUfmxbm6h/JoM/yotA==} + engines: {node: '>= 18.20.6'} + peerDependencies: + ajv: 4.11.8 - 8 + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -4999,16 +5011,16 @@ packages: resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} engines: {node: '>= 0.10'} - browserify-sign@4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} + browserify-sign@4.2.5: + resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} + engines: {node: '>= 0.10'} browserslist@3.2.8: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true - browserslist@4.26.0: - resolution: {integrity: sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5125,18 +5137,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - - caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - - callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -5144,10 +5144,6 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - camelcase@3.0.0: resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} engines: {node: '>=0.10.0'} @@ -5164,8 +5160,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001741: - resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + caniuse-lite@1.0.30001748: + resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -5222,21 +5218,12 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} @@ -5297,8 +5284,8 @@ packages: engines: {node: '>=4.0.0', npm: '>=3.0.0'} deprecated: This module has been superseded by the multiformats module - cipher-base@1.0.6: - resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} engines: {node: '>= 0.10'} class-is@1.1.0: @@ -5340,12 +5327,8 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - - cli-truncate@5.0.0: - resolution: {integrity: sha512-ds7u02fPOOBpcUl2VSjLF3lfnAik9u7Zt0BTaaAQlT5RtABALl4cvpJHthXx+rM50J4gSfXKPH5Tix/tfdefUQ==} + cli-truncate@5.1.0: + resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==} engines: {node: '>=20'} cli-width@3.0.0: @@ -5397,17 +5380,27 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-convert@3.1.2: + resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} + engines: {node: '>=14.6'} + color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-name@2.0.2: + resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==} + engines: {node: '>=12.20'} + + color-string@2.1.2: + resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} + engines: {node: '>=18'} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@5.0.2: + resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} + engines: {node: '>=18'} colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -5416,9 +5409,6 @@ packages: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5471,10 +5461,6 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} @@ -5525,27 +5511,14 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - conventional-changelog-angular@7.0.0: resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} engines: {node: '>=16'} - conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - conventional-changelog-conventionalcommits@7.0.2: resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} engines: {node: '>=16'} - conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - conventional-commits-parser@5.0.0: resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} engines: {node: '>=16'} @@ -5596,35 +5569,19 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cosmiconfig-typescript-loader@2.0.2: - resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@types/node': ^20.17.50 - cosmiconfig: '>=7' - typescript: ^5.8.3 - cosmiconfig-typescript-loader@6.1.0: resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} engines: {node: '>=v18'} peerDependencies: '@types/node': ^20.17.50 cosmiconfig: '>=9' - typescript: ^5.8.3 - - cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + typescript: '>=5' cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.9.5' peerDependenciesMeta: typescript: optional: true @@ -5633,7 +5590,7 @@ packages: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.9.5' peerDependenciesMeta: typescript: optional: true @@ -5646,9 +5603,6 @@ packages: create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - create-hash@1.1.3: - resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} - create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -5695,10 +5649,6 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} - dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dargs@8.1.0: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} @@ -5725,6 +5675,9 @@ packages: dataloader@2.2.3: resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + dayjs@1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} @@ -5773,10 +5726,6 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -5785,9 +5734,6 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -5897,6 +5843,10 @@ packages: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} + dependency-graph@1.0.0: + resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} + engines: {node: '>=4'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -5911,10 +5861,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - detect-indent@4.0.0: resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} engines: {node: '>=0.10.0'} @@ -5964,10 +5910,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} @@ -6016,8 +5958,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.218: - resolution: {integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==} + electron-to-chromium@1.5.230: + resolution: {integrity: sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -6142,8 +6084,8 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -6211,19 +6153,6 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@50.8.0: - resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-markdown@5.1.0: - resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - deprecated: Please use @eslint/markdown instead - peerDependencies: - eslint: '>=8' - eslint-plugin-no-only-tests@3.3.0: resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} @@ -6242,10 +6171,6 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6258,14 +6183,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - eslint@9.35.0: - resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6282,10 +6201,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} @@ -6479,10 +6394,6 @@ packages: ethers@5.8.0: resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} - ethers@6.13.7: - resolution: {integrity: sha512-qbaJ0uIrjh+huP1Lad2f2QtzW5dcqSVjIzVH6yWB4dKoMuj2WqYz5aMeeQTCNpAKgTJBM5J9vcc2cYJ23UAimQ==} - engines: {node: '>=14.0.0'} - ethers@6.15.0: resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} engines: {node: '>=14.0.0'} @@ -6530,10 +6441,6 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - expand-brackets@0.1.5: resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} engines: {node: '>=0.10.0'} @@ -6550,10 +6457,6 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} @@ -6624,10 +6527,6 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -6693,10 +6592,6 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -6766,14 +6661,6 @@ packages: find-yarn-workspace-root@2.0.0: resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} - findup-sync@5.0.0: - resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} - engines: {node: '>= 10.13.0'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -6877,10 +6764,6 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.2: - resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} - engines: {node: '>=14.14'} - fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} @@ -6961,6 +6844,10 @@ packages: resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} deprecated: This package is no longer supported. + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -7011,10 +6898,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -7030,11 +6913,6 @@ packages: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} hasBin: true - git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} @@ -7092,22 +6970,10 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} - global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} @@ -7115,10 +6981,6 @@ packages: global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -7196,8 +7058,8 @@ packages: peerDependencies: graphql: ^15.2.0 || ^16.0.0 - graphql-yoga@5.15.2: - resolution: {integrity: sha512-8cAdS1HNz5XRfYwr+t3jPP9KTyws1G0fYYaLZ5kgqXbcDJLhGjF1RVL21qL86g+DdmNi7uR+g4R+Zgzz6GBAzw==} + graphql-yoga@5.16.0: + resolution: {integrity: sha512-/R2dJea7WgvNlXRU4F8iFwWd95Qn1mN+R+yC8XBs1wKjUzr0Pvv8cGYtt6UUcVHw5CiDEtu7iQY5oOe3sDAWCQ==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^15.2.0 || ^16.0.0 @@ -7232,10 +7094,6 @@ packages: engines: {node: '>=6'} deprecated: this library is no longer supported - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - hardhat-abi-exporter@2.11.0: resolution: {integrity: sha512-hBC4Xzncew9pdqVpzWoEEBJUthp99TCH39cHlMehVxBBQ6EIsIFyj3N0yd0hkVDfM8/s/FMRAuO5jntZBpwCZQ==} engines: {node: '>=14.14.0'} @@ -7285,7 +7143,7 @@ packages: hasBin: true peerDependencies: ts-node: '*' - typescript: ^5.8.3 + typescript: '*' peerDependenciesMeta: ts-node: optional: true @@ -7354,16 +7212,9 @@ packages: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} - hash-base@2.0.2: - resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} - - hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - - hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} hash-it@6.0.0: resolution: {integrity: sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w==} @@ -7403,9 +7254,15 @@ packages: hermes-estree@0.29.1: resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + hermes-estree@0.32.0: + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==} + hermes-parser@0.29.1: resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + hermes-parser@0.32.0: + resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==} + hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -7413,17 +7270,9 @@ packages: resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} engines: {node: '>=0.10.0'} - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -7484,10 +7333,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - husky@7.0.4: resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} engines: {node: '>=12'} @@ -7549,10 +7394,6 @@ packages: immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -7640,15 +7481,9 @@ packages: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} @@ -7663,9 +7498,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -7713,9 +7545,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -7727,10 +7556,6 @@ packages: resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} engines: {node: '>= 0.4'} - is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -7795,8 +7620,8 @@ packages: is-function@1.0.2: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@2.0.1: @@ -7811,9 +7636,6 @@ packages: resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -7855,14 +7677,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -7907,10 +7721,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -7923,10 +7733,6 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} @@ -8062,8 +7868,8 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true js-cookie@2.2.1: @@ -8099,14 +7905,6 @@ packages: jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} - - jsel@1.1.6: - resolution: {integrity: sha512-7E6r8kVzjmKhwXR/82Z+43edfOJGRvLvx6cJZ+SS2MGAPPtYZGnaIsFHpQMA1IbIPA9twDProkob4IIAJ0ZqSw==} - engines: {node: '>=0.10.0'} - jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -8132,9 +7930,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -8223,8 +8018,8 @@ packages: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} - katex@0.16.22: - resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} + katex@0.16.23: + resolution: {integrity: sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==} hasBin: true keccak@3.0.1: @@ -8389,10 +8184,6 @@ packages: resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} engines: {node: '>=10'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8404,13 +8195,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - lint-staged@15.5.2: - resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} - engines: {node: '>=18.12.0'} - hasBin: true - - lint-staged@16.1.6: - resolution: {integrity: sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==} + lint-staged@16.2.3: + resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} engines: {node: '>=20.17'} hasBin: true @@ -8423,10 +8209,6 @@ packages: enquirer: optional: true - listr2@8.3.3: - resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} - engines: {node: '>=18.0.0'} - listr2@9.0.4: resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} engines: {node: '>=20.0.0'} @@ -8571,8 +8353,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.1: - resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@3.2.0: @@ -8615,14 +8397,6 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} @@ -8663,12 +8437,6 @@ packages: md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -8705,10 +8473,6 @@ packages: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} - meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -8744,61 +8508,61 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.83.1: - resolution: {integrity: sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==} + metro-babel-transformer@0.83.3: + resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} engines: {node: '>=20.19.4'} - metro-cache-key@0.83.1: - resolution: {integrity: sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==} + metro-cache-key@0.83.3: + resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==} engines: {node: '>=20.19.4'} - metro-cache@0.83.1: - resolution: {integrity: sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==} + metro-cache@0.83.3: + resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==} engines: {node: '>=20.19.4'} - metro-config@0.83.1: - resolution: {integrity: sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==} + metro-config@0.83.3: + resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==} engines: {node: '>=20.19.4'} - metro-core@0.83.1: - resolution: {integrity: sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==} + metro-core@0.83.3: + resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==} engines: {node: '>=20.19.4'} - metro-file-map@0.83.1: - resolution: {integrity: sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==} + metro-file-map@0.83.3: + resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==} engines: {node: '>=20.19.4'} - metro-minify-terser@0.83.1: - resolution: {integrity: sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==} + metro-minify-terser@0.83.3: + resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==} engines: {node: '>=20.19.4'} - metro-resolver@0.83.1: - resolution: {integrity: sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==} + metro-resolver@0.83.3: + resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==} engines: {node: '>=20.19.4'} - metro-runtime@0.83.1: - resolution: {integrity: sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==} + metro-runtime@0.83.3: + resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==} engines: {node: '>=20.19.4'} - metro-source-map@0.83.1: - resolution: {integrity: sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==} + metro-source-map@0.83.3: + resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==} engines: {node: '>=20.19.4'} - metro-symbolicate@0.83.1: - resolution: {integrity: sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==} + metro-symbolicate@0.83.3: + resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==} engines: {node: '>=20.19.4'} hasBin: true - metro-transform-plugins@0.83.1: - resolution: {integrity: sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==} + metro-transform-plugins@0.83.3: + resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} engines: {node: '>=20.19.4'} - metro-transform-worker@0.83.1: - resolution: {integrity: sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==} + metro-transform-worker@0.83.3: + resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} engines: {node: '>=20.19.4'} - metro@0.83.1: - resolution: {integrity: sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==} + metro@0.83.3: + resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==} engines: {node: '>=20.19.4'} hasBin: true @@ -8883,9 +8647,6 @@ packages: micromark-util-types@2.0.2: resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} @@ -8926,10 +8687,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -8953,10 +8710,6 @@ packages: min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -8978,10 +8731,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@0.0.8: resolution: {integrity: sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==} @@ -9242,8 +8991,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -9259,10 +9008,6 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -9299,10 +9044,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npmlog@4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} deprecated: This package is no longer supported. @@ -9321,8 +9062,8 @@ packages: oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - ob1@0.83.1: - resolution: {integrity: sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==} + ob1@0.83.3: + resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==} engines: {node: '>=20.19.4'} object-assign@4.1.1: @@ -9339,6 +9080,10 @@ packages: object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -9417,10 +9162,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -9470,10 +9211,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.9.3: - resolution: {integrity: sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg==} + ox@0.9.6: + resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} peerDependencies: - typescript: ^5.8.3 + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true @@ -9574,16 +9315,13 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-asn1@5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + parse-asn1@5.1.9: + resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} engines: {node: '>= 0.10'} parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -9598,28 +9336,14 @@ packages: parse-headers@2.0.6: resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} - parse-imports-exports@0.2.4: - resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - - parse-statements@1.0.11: - resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -9675,10 +9399,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -9722,9 +9442,9 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pbkdf2@3.1.3: - resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} - engines: {node: '>=0.12'} + pbkdf2@3.1.5: + resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + engines: {node: '>= 0.10'} pegjs@0.10.0: resolution: {integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==} @@ -9905,7 +9625,12 @@ packages: resolution: {integrity: sha512-O5HX4/PCE5aqiaEiNGbSRLbSBZQ6kLswAav5LBSewwzhT+sZlN6iAaLZlZcJzPEnIAxwLEHP03xKEg92fflT9Q==} engines: {node: '>=20'} peerDependencies: - prettier: ^3.5.3 + prettier: '>=3.0.0' + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} @@ -9916,13 +9641,6 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-quick@4.2.2: - resolution: {integrity: sha512-uAh96tBW1SsD34VhhDmWuEmqbpfYc/B3j++5MC/6b3Cb8Ow7NJsvKFhg0eoGu2xXX+o9RkahkTK6sUdd8E7g5w==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - prettier: ^3.5.3 - private@0.1.8: resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} engines: {node: '>= 0.6'} @@ -10041,14 +9759,6 @@ packages: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} - q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - deprecated: |- - You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -10089,10 +9799,6 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -10164,26 +9870,18 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} read-pkg-up@1.0.1: resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} engines: {node: '>=0.10.0'} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - read-pkg@1.1.0: resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} engines: {node: '>=0.10.0'} - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -10225,10 +9923,6 @@ packages: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} engines: {node: '>=6.0.0'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - reduce-flatten@2.0.0: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} @@ -10331,10 +10025,6 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -10347,10 +10037,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -10419,15 +10105,14 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} hasBin: true - ripemd160@2.0.1: - resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} - - ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} rlp@2.2.6: resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} @@ -10536,11 +10221,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -10748,9 +10428,6 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - simple-wcswidth@1.1.2: resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} @@ -10822,10 +10499,6 @@ packages: sol-explore@1.6.1: resolution: {integrity: sha512-cmwg7l+QLj2LE3Qvwrdo4aPYcNYY425+bN5VPkgCjkO0CiSz33G5vM5BmMZNrfd/6yNGwcm0KtwDJmh5lUElEQ==} - solc-typed-ast@18.2.4: - resolution: {integrity: sha512-HTkr6b2WMSJ3pgVRf5us/UWjCvfSlvE1yUcHna+miSPerkyppGnZQaJWqrcECa7ZjxmSV7H2buUDKux9hR4ivg==} - hasBin: true - solc@0.4.26: resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} hasBin: true @@ -10840,18 +10513,13 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - solc@0.8.25: - resolution: {integrity: sha512-7P0TF8gPeudl1Ko3RGkyY6XVCxe2SdD/qQhtns1vl3yAbK/PDifKDLHGtx1t7mX3LgR7ojV7Fg/Kc6Q9D2T8UQ==} - engines: {node: '>=10.0.0'} - hasBin: true - solc@0.8.26: resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} engines: {node: '>=10.0.0'} hasBin: true - solhint@5.1.0: - resolution: {integrity: sha512-KWg4gnOnznxHXzH0fUvnhnxnk+1R50GiPChcPeQgA7SKQTSF1LLIEh8R1qbkCEn/fFzz4CfJs+Gh7Rl9uhHy+g==} + solhint@6.0.1: + resolution: {integrity: sha512-Lew5nhmkXqHPybzBzkMzvvWkpOJSSLTkfTZwRriWvfR2naS4YW2PsjVGaoX9tZFmHh7SuS+e2GEGo5FPYYmJ8g==} hasBin: true solidity-ast@0.4.61: @@ -10925,9 +10593,6 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.22: resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} @@ -10948,9 +10613,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - src-location@1.1.0: - resolution: {integrity: sha512-idBVZgLZGzB3B2Et317AFDQto7yRgp1tOuFd+VKIH2dw1jO1b6p07zNjtQoVhkW+CY6oGTp9Y5UIfbJoZRsoFQ==} - sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -11092,18 +10754,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-hex-prefix@1.0.0: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -11172,8 +10826,8 @@ packages: resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} hasBin: true - tar-fs@2.1.3: - resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -11211,10 +10865,6 @@ packages: resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. - text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -11251,13 +10901,14 @@ packages: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} + tiny-lru@11.4.5: + resolution: {integrity: sha512-hkcz3FjNJfKXjV4mjQ1OrXSLAehg8Hw+cEZclOVT+5c/cWQWImQ9wolzTjth+dmmDe++p3bme3fTxz6Q4Etsqw==} + engines: {node: '>=12'} + tiny-lru@8.0.2: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} @@ -11279,8 +10930,8 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} to-fast-properties@1.0.3: @@ -11321,10 +10972,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - trim-right@1.0.1: resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} engines: {node: '>=0.10.0'} @@ -11344,7 +10991,7 @@ packages: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.8.4' ts-command-line-args@2.5.1: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} @@ -11356,12 +11003,12 @@ packages: ts-essentials@6.0.7: resolution: {integrity: sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==} peerDependencies: - typescript: ^5.8.3 + typescript: '>=3.7.0' ts-essentials@7.0.3: resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: - typescript: ^5.8.3 + typescript: '>=3.7.0' ts-generator@0.1.1: resolution: {integrity: sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==} @@ -11374,7 +11021,7 @@ packages: '@swc/core': '>=1.2.50' '@swc/wasm': '>=1.2.50' '@types/node': ^20.17.50 - typescript: ^5.8.3 + typescript: '>=2.7' peerDependenciesMeta: '@swc/core': optional: true @@ -11386,7 +11033,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true peerDependencies: - typescript: ^5.8.3 + typescript: '>=2.7' tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -11404,14 +11051,17 @@ packages: tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tslog@4.9.3: - resolution: {integrity: sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw==} + tslog@4.10.2: + resolution: {integrity: sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g==} engines: {node: '>=16'} tsort@0.0.1: @@ -11445,10 +11095,6 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -11457,18 +11103,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -11484,7 +11122,7 @@ packages: resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: - typescript: ^5.8.3 + typescript: '>=4.3.0' typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -11508,15 +11146,15 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.44.0: - resolution: {integrity: sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==} + typescript-eslint@8.45.0: + resolution: {integrity: sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.8.3 + typescript: '>=4.8.4 <6.0.0' - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -11598,9 +11236,6 @@ packages: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -11687,9 +11322,6 @@ packages: resolution: {integrity: sha512-GIEaZ6o86fj09Wtf0VfZ5XP7tmd4t3jM5aZCgmBi231D0DB1AEBa3Aa6MP48DMsAIi96WkpWLimIWVwOjbDMOw==} engines: {node: '>= 0.8'} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -11708,10 +11340,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -11741,10 +11369,10 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - viem@2.37.6: - resolution: {integrity: sha512-b+1IozQ8TciVQNdQUkOH5xtFR0z7ZxR8pyloENi/a+RA408lv4LoX12ofwoiT3ip0VRhO5ni1em//X0jn/eW0g==} + viem@2.37.13: + resolution: {integrity: sha512-05dh56iMmCyjRLcTIiu8bB4zZLnb9uLOVToDwmBLYDarmoOE8d8SLFkQLc2zLU57FlnYCQIO1VbUviGZYwFGgQ==} peerDependencies: - typescript: ^5.8.3 + typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true @@ -11787,18 +11415,10 @@ packages: resolution: {integrity: sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==} engines: {node: '>=8.0.0'} - web3-errors@1.3.1: - resolution: {integrity: sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==} - engines: {node: '>=14', npm: '>=6.12.0'} - web3-eth-abi@1.2.11: resolution: {integrity: sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==} engines: {node: '>=8.0.0'} - web3-eth-abi@4.4.1: - resolution: {integrity: sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==} - engines: {node: '>=14', npm: '>=6.12.0'} - web3-eth-accounts@1.2.11: resolution: {integrity: sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==} engines: {node: '>=8.0.0'} @@ -11847,10 +11467,6 @@ packages: resolution: {integrity: sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==} engines: {node: '>=8.0.0'} - web3-types@1.10.0: - resolution: {integrity: sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==} - engines: {node: '>=14', npm: '>=6.12.0'} - web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} @@ -11859,14 +11475,6 @@ packages: resolution: {integrity: sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==} engines: {node: '>=8.0.0'} - web3-utils@4.3.3: - resolution: {integrity: sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==} - engines: {node: '>=14', npm: '>=6.12.0'} - - web3-validator@2.0.6: - resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==} - engines: {node: '>=14', npm: '>=6.12.0'} - web3@1.2.11: resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==} engines: {node: '>=8.0.0'} @@ -11941,8 +11549,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + winston@3.18.3: + resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} engines: {node: '>= 12.0.0'} wkx@0.5.0: @@ -12223,11 +11831,14 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.1.11: + resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} + snapshots: '@adraffy/ens-normalize@1.10.1': {} - '@adraffy/ens-normalize@1.11.0': {} + '@adraffy/ens-normalize@1.11.1': {} '@arbitrum/sdk@3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: @@ -12281,7 +11892,7 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 tslib: 2.8.1 '@aws-crypto/sha256-browser@5.2.0': @@ -12289,21 +11900,21 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-locate-window': 3.873.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -12312,349 +11923,349 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-lambda@3.888.0': + '@aws-sdk/client-lambda@3.901.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.888.0 - '@aws-sdk/credential-provider-node': 3.888.0 - '@aws-sdk/middleware-host-header': 3.887.0 - '@aws-sdk/middleware-logger': 3.887.0 - '@aws-sdk/middleware-recursion-detection': 3.887.0 - '@aws-sdk/middleware-user-agent': 3.888.0 - '@aws-sdk/region-config-resolver': 3.887.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.887.0 - '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.888.0 - '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.0 - '@smithy/eventstream-serde-browser': 4.1.1 - '@smithy/eventstream-serde-config-resolver': 4.2.1 - '@smithy/eventstream-serde-node': 4.1.1 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/hash-node': 4.1.1 - '@smithy/invalid-dependency': 4.1.1 - '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-retry': 4.2.2 - '@smithy/middleware-serde': 4.1.1 - '@smithy/middleware-stack': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/node-http-handler': 4.2.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.2 - '@smithy/util-defaults-mode-node': 4.1.2 - '@smithy/util-endpoints': 3.1.2 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@smithy/util-stream': 4.3.1 - '@smithy/util-utf8': 4.1.0 - '@smithy/util-waiter': 4.1.1 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/credential-provider-node': 3.901.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.901.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.901.0 + '@aws-sdk/util-user-agent-node': 3.901.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.14.0 + '@smithy/eventstream-serde-browser': 4.2.0 + '@smithy/eventstream-serde-config-resolver': 4.3.0 + '@smithy/eventstream-serde-node': 4.2.0 + '@smithy/fetch-http-handler': 5.3.0 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.0 + '@smithy/middleware-retry': 4.4.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.2.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.0 + '@smithy/util-defaults-mode-browser': 4.2.0 + '@smithy/util-defaults-mode-node': 4.2.0 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-stream': 4.4.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.888.0': + '@aws-sdk/client-sso@3.901.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.888.0 - '@aws-sdk/middleware-host-header': 3.887.0 - '@aws-sdk/middleware-logger': 3.887.0 - '@aws-sdk/middleware-recursion-detection': 3.887.0 - '@aws-sdk/middleware-user-agent': 3.888.0 - '@aws-sdk/region-config-resolver': 3.887.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.887.0 - '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.888.0 - '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/hash-node': 4.1.1 - '@smithy/invalid-dependency': 4.1.1 - '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-retry': 4.2.2 - '@smithy/middleware-serde': 4.1.1 - '@smithy/middleware-stack': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/node-http-handler': 4.2.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.2 - '@smithy/util-defaults-mode-node': 4.1.2 - '@smithy/util-endpoints': 3.1.2 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@smithy/util-utf8': 4.1.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.901.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.901.0 + '@aws-sdk/util-user-agent-node': 3.901.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.14.0 + '@smithy/fetch-http-handler': 5.3.0 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.0 + '@smithy/middleware-retry': 4.4.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.2.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.0 + '@smithy/util-defaults-mode-browser': 4.2.0 + '@smithy/util-defaults-mode-node': 4.2.0 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.888.0': - dependencies: - '@aws-sdk/types': 3.887.0 - '@aws-sdk/xml-builder': 3.887.0 - '@smithy/core': 3.11.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/property-provider': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-utf8': 4.1.0 - fast-xml-parser: 5.2.5 + '@aws-sdk/core@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/core': 3.14.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.888.0': + '@aws-sdk/credential-provider-env@3.901.0': dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.888.0': - dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/node-http-handler': 4.2.1 - '@smithy/property-provider': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-stream': 4.3.1 + '@aws-sdk/credential-provider-http@3.901.0': + dependencies: + '@aws-sdk/core': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/fetch-http-handler': 5.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.4.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.888.0': - dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/credential-provider-env': 3.888.0 - '@aws-sdk/credential-provider-http': 3.888.0 - '@aws-sdk/credential-provider-process': 3.888.0 - '@aws-sdk/credential-provider-sso': 3.888.0 - '@aws-sdk/credential-provider-web-identity': 3.888.0 - '@aws-sdk/nested-clients': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/credential-provider-imds': 4.1.2 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/credential-provider-ini@3.901.0': + dependencies: + '@aws-sdk/core': 3.901.0 + '@aws-sdk/credential-provider-env': 3.901.0 + '@aws-sdk/credential-provider-http': 3.901.0 + '@aws-sdk/credential-provider-process': 3.901.0 + '@aws-sdk/credential-provider-sso': 3.901.0 + '@aws-sdk/credential-provider-web-identity': 3.901.0 + '@aws-sdk/nested-clients': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.888.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.888.0 - '@aws-sdk/credential-provider-http': 3.888.0 - '@aws-sdk/credential-provider-ini': 3.888.0 - '@aws-sdk/credential-provider-process': 3.888.0 - '@aws-sdk/credential-provider-sso': 3.888.0 - '@aws-sdk/credential-provider-web-identity': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/credential-provider-imds': 4.1.2 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/credential-provider-node@3.901.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.901.0 + '@aws-sdk/credential-provider-http': 3.901.0 + '@aws-sdk/credential-provider-ini': 3.901.0 + '@aws-sdk/credential-provider-process': 3.901.0 + '@aws-sdk/credential-provider-sso': 3.901.0 + '@aws-sdk/credential-provider-web-identity': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.888.0': + '@aws-sdk/credential-provider-process@3.901.0': dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.888.0': + '@aws-sdk/credential-provider-sso@3.901.0': dependencies: - '@aws-sdk/client-sso': 3.888.0 - '@aws-sdk/core': 3.888.0 - '@aws-sdk/token-providers': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/client-sso': 3.901.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/token-providers': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.888.0': + '@aws-sdk/credential-provider-web-identity@3.901.0': dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/nested-clients': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/nested-clients': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.887.0': + '@aws-sdk/middleware-host-header@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.887.0': + '@aws-sdk/middleware-logger@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/types': 4.5.0 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.887.0': + '@aws-sdk/middleware-recursion-detection@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 '@aws/lambda-invoke-store': 0.0.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.888.0': + '@aws-sdk/middleware-user-agent@3.901.0': dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.887.0 - '@smithy/core': 3.11.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@smithy/core': 3.14.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.888.0': + '@aws-sdk/nested-clients@3.901.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.888.0 - '@aws-sdk/middleware-host-header': 3.887.0 - '@aws-sdk/middleware-logger': 3.887.0 - '@aws-sdk/middleware-recursion-detection': 3.887.0 - '@aws-sdk/middleware-user-agent': 3.888.0 - '@aws-sdk/region-config-resolver': 3.887.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.887.0 - '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.888.0 - '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/hash-node': 4.1.1 - '@smithy/invalid-dependency': 4.1.1 - '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-retry': 4.2.2 - '@smithy/middleware-serde': 4.1.1 - '@smithy/middleware-stack': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/node-http-handler': 4.2.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.2 - '@smithy/util-defaults-mode-node': 4.1.2 - '@smithy/util-endpoints': 3.1.2 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@smithy/util-utf8': 4.1.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.901.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.901.0 + '@aws-sdk/util-user-agent-node': 3.901.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.14.0 + '@smithy/fetch-http-handler': 5.3.0 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.0 + '@smithy/middleware-retry': 4.4.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.2.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.0 + '@smithy/util-defaults-mode-browser': 4.2.0 + '@smithy/util-defaults-mode-node': 4.2.0 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.887.0': + '@aws-sdk/region-config-resolver@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 - '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.1 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.888.0': + '@aws-sdk/token-providers@3.901.0': dependencies: - '@aws-sdk/core': 3.888.0 - '@aws-sdk/nested-clients': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.901.0 + '@aws-sdk/nested-clients': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.887.0': + '@aws-sdk/types@3.901.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.887.0': + '@aws-sdk/util-endpoints@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-endpoints': 3.1.2 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-endpoints': 3.2.0 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.873.0': + '@aws-sdk/util-locate-window@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.887.0': + '@aws-sdk/util-user-agent-browser@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/types': 4.5.0 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.888.0': + '@aws-sdk/util-user-agent-node@3.901.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.888.0 - '@aws-sdk/types': 3.887.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 + '@aws-sdk/middleware-user-agent': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.887.0': + '@aws-sdk/xml-builder@3.901.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 + fast-xml-parser: 5.2.5 tslib: 2.8.1 '@aws/lambda-invoke-store@0.0.1': {} @@ -12703,7 +12314,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.0 + browserslist: 4.26.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -13064,7 +12675,7 @@ snapshots: fs-extra: 7.0.1 lodash.startcase: 4.4.0 outdent: 0.5.0 - prettier: 3.6.2 + prettier: 2.8.8 resolve-from: 5.0.0 semver: 7.7.2 @@ -13081,7 +12692,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@20.19.14)': + '@changesets/cli@2.29.7(@types/node@20.19.19)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -13097,7 +12708,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@20.19.14) + '@inquirer/external-editor': 1.0.2(@types/node@20.19.19) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -13194,138 +12805,73 @@ snapshots: '@changesets/types': 6.1.0 fs-extra: 7.0.1 human-id: 4.1.1 - prettier: 3.6.2 + prettier: 2.8.8 '@colors/colors@1.5.0': optional: true '@colors/colors@1.6.0': {} - '@commitlint/cli@16.3.0': - dependencies: - '@commitlint/format': 16.2.1 - '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0 - '@commitlint/read': 16.2.1 - '@commitlint/types': 16.2.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@commitlint/cli@19.8.1(@types/node@20.19.14)(typescript@5.9.2)': + '@commitlint/cli@20.1.0(@types/node@20.19.19)(typescript@5.9.3)': dependencies: - '@commitlint/format': 19.8.1 - '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@20.19.14)(typescript@5.9.2) - '@commitlint/read': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/format': 20.0.0 + '@commitlint/lint': 20.0.0 + '@commitlint/load': 20.1.0(@types/node@20.19.19)(typescript@5.9.3) + '@commitlint/read': 20.0.0 + '@commitlint/types': 20.0.0 tinyexec: 1.0.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/config-conventional@16.2.4': - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - - '@commitlint/config-conventional@19.8.1': + '@commitlint/config-conventional@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@16.2.1': - dependencies: - '@commitlint/types': 16.2.1 - ajv: 6.12.6 - - '@commitlint/config-validator@19.8.1': + '@commitlint/config-validator@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 ajv: 8.17.1 - '@commitlint/ensure@16.2.1': + '@commitlint/ensure@20.0.0': dependencies: - '@commitlint/types': 16.2.1 - lodash: 4.17.21 - - '@commitlint/ensure@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - '@commitlint/execute-rule@16.2.1': {} - - '@commitlint/execute-rule@19.8.1': {} + '@commitlint/execute-rule@20.0.0': {} - '@commitlint/format@16.2.1': + '@commitlint/format@20.0.0': dependencies: - '@commitlint/types': 16.2.1 - chalk: 4.1.2 - - '@commitlint/format@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 chalk: 5.6.2 - '@commitlint/is-ignored@16.2.4': - dependencies: - '@commitlint/types': 16.2.1 - semver: 7.3.7 - - '@commitlint/is-ignored@19.8.1': + '@commitlint/is-ignored@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 semver: 7.7.2 - '@commitlint/lint@16.2.4': - dependencies: - '@commitlint/is-ignored': 16.2.4 - '@commitlint/parse': 16.2.1 - '@commitlint/rules': 16.2.4 - '@commitlint/types': 16.2.1 - - '@commitlint/lint@19.8.1': - dependencies: - '@commitlint/is-ignored': 19.8.1 - '@commitlint/parse': 19.8.1 - '@commitlint/rules': 19.8.1 - '@commitlint/types': 19.8.1 - - '@commitlint/load@16.3.0': + '@commitlint/lint@20.0.0': dependencies: - '@commitlint/config-validator': 16.2.1 - '@commitlint/execute-rule': 16.2.1 - '@commitlint/resolve-extends': 16.2.1 - '@commitlint/types': 16.2.1 - '@types/node': 20.19.14 - chalk: 4.1.2 - cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2(@types/node@20.19.14)(cosmiconfig@7.1.0)(typescript@5.9.2) - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 5.9.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + '@commitlint/is-ignored': 20.0.0 + '@commitlint/parse': 20.0.0 + '@commitlint/rules': 20.0.0 + '@commitlint/types': 20.0.0 - '@commitlint/load@19.8.1(@types/node@20.19.14)(typescript@5.9.2)': + '@commitlint/load@20.1.0(@types/node@20.19.19)(typescript@5.9.3)': dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/execute-rule': 19.8.1 - '@commitlint/resolve-extends': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/config-validator': 20.0.0 + '@commitlint/execute-rule': 20.0.0 + '@commitlint/resolve-extends': 20.1.0 + '@commitlint/types': 20.0.0 chalk: 5.6.2 - cosmiconfig: 9.0.0(typescript@5.9.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@20.19.14)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@20.19.19)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -13333,87 +12879,45 @@ snapshots: - '@types/node' - typescript - '@commitlint/message@16.2.1': {} - - '@commitlint/message@19.8.1': {} + '@commitlint/message@20.0.0': {} - '@commitlint/parse@16.2.1': + '@commitlint/parse@20.0.0': dependencies: - '@commitlint/types': 16.2.1 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - - '@commitlint/parse@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/read@16.2.1': - dependencies: - '@commitlint/top-level': 16.2.1 - '@commitlint/types': 16.2.1 - fs-extra: 10.1.0 - git-raw-commits: 2.0.11 - - '@commitlint/read@19.8.1': + '@commitlint/read@20.0.0': dependencies: - '@commitlint/top-level': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/top-level': 20.0.0 + '@commitlint/types': 20.0.0 git-raw-commits: 4.0.0 minimist: 1.2.8 tinyexec: 1.0.1 - '@commitlint/resolve-extends@16.2.1': - dependencies: - '@commitlint/config-validator': 16.2.1 - '@commitlint/types': 16.2.1 - import-fresh: 3.3.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - - '@commitlint/resolve-extends@19.8.1': + '@commitlint/resolve-extends@20.1.0': dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/config-validator': 20.0.0 + '@commitlint/types': 20.0.0 global-directory: 4.0.1 import-meta-resolve: 4.2.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@16.2.4': - dependencies: - '@commitlint/ensure': 16.2.1 - '@commitlint/message': 16.2.1 - '@commitlint/to-lines': 16.2.1 - '@commitlint/types': 16.2.1 - execa: 5.1.1 - - '@commitlint/rules@19.8.1': + '@commitlint/rules@20.0.0': dependencies: - '@commitlint/ensure': 19.8.1 - '@commitlint/message': 19.8.1 - '@commitlint/to-lines': 19.8.1 - '@commitlint/types': 19.8.1 - - '@commitlint/to-lines@16.2.1': {} + '@commitlint/ensure': 20.0.0 + '@commitlint/message': 20.0.0 + '@commitlint/to-lines': 20.0.0 + '@commitlint/types': 20.0.0 - '@commitlint/to-lines@19.8.1': {} - - '@commitlint/top-level@16.2.1': - dependencies: - find-up: 5.0.0 + '@commitlint/to-lines@20.0.0': {} - '@commitlint/top-level@19.8.1': + '@commitlint/top-level@20.0.0': dependencies: find-up: 7.0.0 - '@commitlint/types@16.2.1': - dependencies: - chalk: 4.1.2 - - '@commitlint/types@19.8.1': + '@commitlint/types@20.0.0': dependencies: '@types/conventional-commits-parser': 5.0.1 chalk: 5.6.2 @@ -13422,32 +12926,22 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.3': + '@dabh/diagnostics@2.0.8': dependencies: - colorspace: 1.1.4 + '@so-ric/colorspace': 1.1.6 enabled: 2.0.0 kuler: 2.0.0 - '@defi-wonderland/natspec-smells@1.1.6(typescript@5.9.2)(zod@3.25.76)': - dependencies: - fast-glob: 3.3.2 - solc-typed-ast: 18.2.4(typescript@5.9.2)(zod@3.25.76) - yargs: 17.7.2 - transitivePeerDependencies: - - debug - - typescript - - zod - - '@defi-wonderland/smock@2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@defi-wonderland/smock@2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) diff: 5.2.0 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.2 @@ -13470,7 +12964,7 @@ snapshots: '@envelop/types': 3.0.2 tslib: 2.8.1 - '@envelop/core@5.3.1': + '@envelop/core@5.3.2': dependencies: '@envelop/instrumentation': 1.0.0 '@envelop/types': 5.2.1 @@ -13506,100 +13000,87 @@ snapshots: lru-cache: 6.0.0 tslib: 2.8.1 - '@es-joy/jsdoccomment@0.50.2': - dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.44.0 - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 - - '@esbuild/aix-ppc64@0.25.9': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))': dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -13612,25 +13093,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} - - '@eslint/core@0.15.2': + '@eslint/config-helpers@0.4.0': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 0.16.0 - '@eslint/eslintrc@2.1.4': + '@eslint/core@0.16.0': dependencies: - ajv: 6.12.6 - debug: 4.4.3(supports-color@9.4.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: @@ -13646,15 +13115,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - - '@eslint/js@9.35.0': {} + '@eslint/js@9.37.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 0.16.0 levn: 0.4.1 '@ethereum-waffle/chai@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': @@ -13678,11 +13145,11 @@ snapshots: - '@ensdomains/resolver' - supports-color - '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 2.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.9.2)) + '@typechain/ethers-v5': 2.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.9.3)) '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.13 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -13690,7 +13157,7 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) solc: 0.6.12 ts-generator: 0.1.1 - typechain: 3.0.0(typescript@5.9.2) + typechain: 3.0.0(typescript@5.9.3) transitivePeerDependencies: - bufferutil - encoding @@ -13698,18 +13165,18 @@ snapshots: - typescript - utf-8-validate - '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2)': + '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.13 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) mkdirp: 0.5.6 node-fetch: 2.7.0(encoding@0.1.13) solc: 0.8.15 - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -14268,7 +13735,7 @@ snapshots: '@ethersproject/networks@5.7.0': dependencies: - '@ethersproject/logger': 5.7.0 + '@ethersproject/logger': 5.8.0 '@ethersproject/networks@5.7.1': dependencies: @@ -14334,22 +13801,22 @@ snapshots: dependencies: '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.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.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 bech32: 1.1.4 ws: 7.4.6(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -14646,11 +14113,11 @@ snapshots: '@ethersproject/web@5.7.0': dependencies: - '@ethersproject/base64': 5.7.0 + '@ethersproject/base64': 5.8.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 '@ethersproject/web@5.7.1': dependencies: @@ -14746,52 +14213,52 @@ snapshots: optionalDependencies: '@trufflesuite/bigint-buffer': 1.1.9 - '@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(graphql@16.11.0)': + '@graphprotocol/client-add-source-name@1.0.20(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@11.0.1(graphql@16.11.0))(graphql@16.11.0)': dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) - '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) + '@graphql-tools/wrap': 11.0.1(graphql@16.11.0) graphql: 16.11.0 lodash: 4.17.21 tslib: 2.8.1 - '@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(graphql@16.11.0)': + '@graphprotocol/client-auto-pagination@1.1.18(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@11.0.1(graphql@16.11.0))(graphql@16.11.0)': dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) - '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) + '@graphql-tools/wrap': 11.0.1(graphql@16.11.0) graphql: 16.11.0 lodash: 4.17.21 tslib: 2.8.1 - '@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(graphql@16.11.0)': + '@graphprotocol/client-auto-type-merging@1.0.25(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(graphql@16.11.0)': dependencies: - '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) + '@graphql-mesh/transform-type-merging': 0.93.1(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: - '@graphql-mesh/utils' - '@graphprotocol/client-block-tracking@1.0.14(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(graphql@16.11.0)': + '@graphprotocol/client-block-tracking@1.0.14(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(graphql@16.11.0)': dependencies: - '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 - '@graphprotocol/client-cli@2.2.22(@babel/core@7.28.4)(@envelop/core@5.3.1)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/merge@9.1.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@graphprotocol/client-cli@2.2.22(@babel/core@7.28.4)(@envelop/core@5.3.2)(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/store@0.104.13(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(@graphql-tools/merge@9.1.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@11.0.1(graphql@16.11.0))(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(graphql@16.11.0) - '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(graphql@16.11.0) - '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(graphql@16.11.0) - '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(graphql@16.11.0) - '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@5.3.1)(@graphql-tools/merge@9.1.1(graphql@16.11.0))(graphql@16.11.0) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.28.4)(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(tslib@2.8.1)(utf-8-validate@5.0.10) + '@graphprotocol/client-add-source-name': 1.0.20(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@11.0.1(graphql@16.11.0))(graphql@16.11.0) + '@graphprotocol/client-auto-pagination': 1.1.18(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@graphql-tools/wrap@11.0.1(graphql@16.11.0))(graphql@16.11.0) + '@graphprotocol/client-auto-type-merging': 1.0.25(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(graphql@16.11.0) + '@graphprotocol/client-block-tracking': 1.0.14(@graphql-tools/delegate@11.0.1(graphql@16.11.0))(graphql@16.11.0) + '@graphprotocol/client-polling-live': 1.1.1(@envelop/core@5.3.2)(@graphql-tools/merge@9.1.1(graphql@16.11.0))(graphql@16.11.0) + '@graphql-mesh/cli': 0.82.35(@babel/core@7.28.4)(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@graphql-mesh/graphql': 0.93.1(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/store@0.104.13(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(tslib@2.8.1)(utf-8-validate@5.0.10) graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: @@ -14816,9 +14283,9 @@ snapshots: - supports-color - utf-8-validate - '@graphprotocol/client-polling-live@1.1.1(@envelop/core@5.3.1)(@graphql-tools/merge@9.1.1(graphql@16.11.0))(graphql@16.11.0)': + '@graphprotocol/client-polling-live@1.1.1(@envelop/core@5.3.2)(@graphql-tools/merge@9.1.1(graphql@16.11.0))(graphql@16.11.0)': dependencies: - '@envelop/core': 5.3.1 + '@envelop/core': 5.3.2 '@graphql-tools/merge': 9.1.1(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 graphql: 16.11.0 @@ -14924,7 +14391,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphprotocol/sdk@0.6.0(bufferutil@4.0.9)(encoding@0.1.13)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@graphprotocol/sdk@0.6.0(bufferutil@4.0.9)(encoding@0.1.13)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@arbitrum/sdk': 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@ethersproject/abstract-provider': 5.8.0 @@ -14932,12 +14399,12 @@ snapshots: '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@graphprotocol/common-ts': 2.0.11(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@graphprotocol/contracts': 7.2.1 - '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) - hardhat-secure-accounts: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-secure-accounts: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) inquirer: 8.0.0 lodash: 4.17.21 yaml: 1.10.2 @@ -15097,6 +14564,12 @@ snapshots: - encoding - supports-color + '@graphql-hive/pubsub@2.0.0-next-38d601a82253147a4bfe657c7eee418d25c183b6': + dependencies: + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + '@graphql-inspector/core@3.3.0(graphql@16.11.0)': dependencies: dependency-graph: 0.11.0 @@ -15104,15 +14577,22 @@ snapshots: object-inspect: 1.10.3 tslib: 2.8.1 + '@graphql-inspector/core@6.2.1(graphql@16.11.0)': + dependencies: + dependency-graph: 1.0.0 + graphql: 16.11.0 + object-inspect: 1.13.2 + tslib: 2.6.2 + '@graphql-mesh/cache-localforage@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1)': dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) graphql: 16.11.0 localforage: 1.10.0 tslib: 2.8.1 - '@graphql-mesh/cli@0.82.35(@babel/core@7.28.4)(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@graphql-mesh/cli@0.82.35(@babel/core@7.28.4)(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@graphql-codegen/core': 3.1.0(graphql@16.11.0) '@graphql-codegen/typed-document-node': 4.0.1(encoding@0.1.13)(graphql@16.11.0) @@ -15120,17 +14600,17 @@ snapshots: '@graphql-codegen/typescript-generic-sdk': 3.1.0(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0) '@graphql-codegen/typescript-operations': 3.0.4(encoding@0.1.13)(graphql@16.11.0) '@graphql-codegen/typescript-resolvers': 3.2.1(encoding@0.1.13)(graphql@16.11.0) - '@graphql-mesh/config': 0.93.1(@babel/core@7.28.4)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - '@graphql-mesh/http': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/config': 0.93.1(@babel/core@7.28.4)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) + '@graphql-mesh/http': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) ajv: 8.17.1 change-case: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) dnscache: 1.0.2 dotenv: 16.6.1 graphql: 16.11.0 @@ -15141,11 +14621,11 @@ snapshots: mkdirp: 3.0.1 open: 7.4.2 pascal-case: 3.1.2 - rimraf: 5.0.10 - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + rimraf: 5.0.5 + ts-node: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) tsconfig-paths: 4.2.0 tslib: 2.8.1 - typescript: 5.9.2 + typescript: 5.9.3 ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: @@ -15161,17 +14641,17 @@ snapshots: - supports-color - utf-8-validate - '@graphql-mesh/config@0.93.1(@babel/core@7.28.4)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/config@0.93.1(@babel/core@7.28.4)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: '@envelop/core': 3.0.6 '@graphql-mesh/cache-localforage': 0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) '@graphql-mesh/merger-bare': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-mesh/merger-stitching': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/code-file-loader': 7.3.23(@babel/core@7.28.4)(graphql@16.11.0) '@graphql-tools/graphql-file-loader': 7.5.17(graphql@16.11.0) '@graphql-tools/load': 7.8.14(graphql@16.11.0) @@ -15186,37 +14666,32 @@ snapshots: - '@babel/core' - supports-color - '@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))': + '@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))': dependencies: - '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@graphql-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 path-browserify: 1.0.1 - react-native-fs: 2.20.0(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) + react-native-fs: 2.20.0(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) react-native-path: 0.0.5 transitivePeerDependencies: - react-native - react-native-windows - '@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))': + '@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 9.2.1(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) graphql: 16.11.0 path-browserify: 1.0.1 - react-native-fs: 2.20.0(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - react-native-path: 0.0.5 - transitivePeerDependencies: - - react-native - - react-native-windows - '@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(tslib@2.8.1)(utf-8-validate@5.0.10)': + '@graphql-mesh/graphql@0.93.1(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/store@0.104.13(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(tslib@2.8.1)(utf-8-validate@5.0.10)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.11.0) + '@graphql-mesh/store': 0.104.13(graphql@16.11.0) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-mesh/utils': 0.104.13(graphql@16.11.0) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) - '@graphql-tools/url-loader': 7.17.18(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(utf-8-validate@5.0.10) + '@graphql-tools/url-loader': 7.17.18(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(utf-8-validate@5.0.10) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) graphql: 16.11.0 @@ -15228,12 +14703,12 @@ snapshots: - encoding - utf-8-validate - '@graphql-mesh/http@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/http@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.4.10(graphql@16.11.0))(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) + '@graphql-mesh/runtime': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) fets: 0.1.5 graphql: 16.11.0 graphql-yoga: 3.9.1(graphql@16.11.0) @@ -15242,8 +14717,8 @@ snapshots: '@graphql-mesh/merger-bare@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: '@graphql-mesh/merger-stitching': 0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/schema': 9.0.19(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 @@ -15253,9 +14728,9 @@ snapshots: '@graphql-mesh/merger-stitching@0.93.1(@graphql-mesh/store@0.93.1)(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) '@graphql-tools/schema': 9.0.19(graphql@16.11.0) '@graphql-tools/stitch': 8.7.50(graphql@16.11.0) @@ -15264,39 +14739,42 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/runtime@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: '@envelop/core': 3.0.6 '@envelop/extended-validation': 2.0.6(@envelop/core@3.0.6)(graphql@16.11.0) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.11.0) '@graphql-tools/batch-execute': 8.5.22(graphql@16.11.0) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) - '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@graphql-tools/utils': 9.2.1(graphql@16.11.0) '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) '@whatwg-node/fetch': 0.8.8 graphql: 16.11.0 tslib: 2.8.1 - '@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/store@0.104.13(graphql@16.11.0)': dependencies: - '@graphql-inspector/core': 3.3.0(graphql@16.11.0) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-inspector/core': 6.2.1(graphql@16.11.0) + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.11.0) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-mesh/utils': 0.104.13(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 + transitivePeerDependencies: + - '@nats-io/nats-core' + - ioredis - '@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/store@0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: '@graphql-inspector/core': 3.3.0(graphql@16.11.0) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 @@ -15309,28 +14787,42 @@ snapshots: lodash.get: 4.4.2 tslib: 2.8.1 - '@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/string-interpolation@0.5.9(graphql@16.11.0)': + dependencies: + dayjs: 1.11.18 + graphql: 16.11.0 + json-pointer: 0.6.2 + lodash.get: 4.4.2 + tslib: 2.8.1 + + '@graphql-mesh/transform-type-merging@0.93.1(@graphql-mesh/types@0.104.13(graphql@16.11.0))(@graphql-mesh/utils@0.104.13(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/utils': 0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-mesh/utils': 0.104.13(graphql@16.11.0) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) '@graphql-tools/stitching-directives': 2.3.34(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 - '@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/types@0.104.13(graphql@16.11.0)': dependencies: - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-tools/batch-delegate': 8.4.27(graphql@16.11.0) - '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) + '@graphql-hive/pubsub': 2.0.0-next-38d601a82253147a4bfe657c7eee418d25c183b6 + '@graphql-mesh/store': 0.104.13(graphql@16.11.0) + '@graphql-tools/batch-delegate': 10.0.1(graphql@16.11.0) + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 graphql: 16.11.0 tslib: 2.8.1 + transitivePeerDependencies: + - '@nats-io/nats-core' + - ioredis '@graphql-mesh/types@0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: - '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/store': 0.93.1(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-mesh/utils@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/batch-delegate': 8.4.27(graphql@16.11.0) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) @@ -15338,26 +14830,35 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/utils@0.104.13(graphql@16.11.0)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) - '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) - '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) + '@envelop/instrumentation': 1.0.0 + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.11.0) + '@graphql-mesh/string-interpolation': 0.5.9(graphql@16.11.0) + '@graphql-mesh/types': 0.104.13(graphql@16.11.0) + '@graphql-tools/batch-delegate': 10.0.1(graphql@16.11.0) + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@graphql-tools/wrap': 11.0.1(graphql@16.11.0) + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.11 + '@whatwg-node/promise-helpers': 1.3.2 dset: 3.1.4 graphql: 16.11.0 js-yaml: 4.1.0 lodash.get: 4.4.2 lodash.topath: 4.5.2 - tiny-lru: 8.0.2 + tiny-lru: 11.4.5 tslib: 2.8.1 + transitivePeerDependencies: + - '@nats-io/nats-core' + - ioredis - '@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': + '@graphql-mesh/utils@0.93.2(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)))(@graphql-mesh/types@0.93.2)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)) + '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)) '@graphql-mesh/string-interpolation': 0.4.4(graphql@16.11.0)(tslib@2.8.1) - '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@10.9.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) + '@graphql-mesh/types': 0.93.2(@graphql-mesh/store@0.93.1)(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(tslib@2.8.1) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) dset: 3.1.4 @@ -15368,6 +14869,15 @@ snapshots: tiny-lru: 8.0.2 tslib: 2.8.1 + '@graphql-tools/batch-delegate@10.0.1(graphql@16.11.0)': + dependencies: + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + graphql: 16.11.0 + tslib: 2.8.1 + '@graphql-tools/batch-delegate@8.4.27(graphql@16.11.0)': dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) @@ -15377,6 +14887,14 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 + '@graphql-tools/batch-execute@10.0.1(graphql@16.11.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + graphql: 16.11.0 + tslib: 2.8.1 + '@graphql-tools/batch-execute@8.5.22(graphql@16.11.0)': dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.11.0) @@ -15397,6 +14915,19 @@ snapshots: - '@babel/core' - supports-color + '@graphql-tools/delegate@11.0.1(graphql@16.11.0)': + dependencies: + '@graphql-tools/batch-execute': 10.0.1(graphql@16.11.0) + '@graphql-tools/executor': 1.4.9(graphql@16.11.0) + '@graphql-tools/schema': 10.0.25(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + dset: 3.1.4 + graphql: 16.11.0 + tslib: 2.8.1 + '@graphql-tools/delegate@9.0.35(graphql@16.11.0)': dependencies: '@graphql-tools/batch-execute': 8.5.22(graphql@16.11.0) @@ -15422,7 +14953,7 @@ snapshots: - bufferutil - utf-8-validate - '@graphql-tools/executor-http@0.1.10(@types/node@20.19.14)(graphql@16.11.0)': + '@graphql-tools/executor-http@0.1.10(@types/node@20.19.19)(graphql@16.11.0)': dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 @@ -15430,7 +14961,7 @@ snapshots: dset: 3.1.4 extract-files: 11.0.0 graphql: 16.11.0 - meros: 1.3.2(@types/node@20.19.14) + meros: 1.3.2(@types/node@20.19.19) tslib: 2.8.1 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -15575,12 +15106,12 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/url-loader@7.17.18(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(utf-8-validate@5.0.10)': + '@graphql-tools/url-loader@7.17.18(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(utf-8-validate@5.0.10)': dependencies: '@ardatan/sync-fetch': 0.0.1(encoding@0.1.13) '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) '@graphql-tools/executor-graphql-ws': 0.0.14(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10) - '@graphql-tools/executor-http': 0.1.10(@types/node@20.19.14)(graphql@16.11.0) + '@graphql-tools/executor-http': 0.1.10(@types/node@20.19.19)(graphql@16.11.0) '@graphql-tools/executor-legacy-ws': 0.0.11(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) @@ -15617,6 +15148,15 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 + '@graphql-tools/wrap@11.0.1(graphql@16.11.0)': + dependencies: + '@graphql-tools/delegate': 11.0.1(graphql@16.11.0) + '@graphql-tools/schema': 10.0.25(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.11.0 + tslib: 2.8.1 + '@graphql-tools/wrap@9.4.2(graphql@16.11.0)': dependencies: '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) @@ -15642,11 +15182,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@graphql-yoga/plugin-persisted-operations@3.15.2(graphql-yoga@5.15.2(graphql@16.11.0))(graphql@16.11.0)': + '@graphql-yoga/plugin-persisted-operations@3.16.0(graphql-yoga@5.16.0(graphql@16.11.0))(graphql@16.11.0)': dependencies: '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.11.0 - graphql-yoga: 5.15.2(graphql@16.11.0) + graphql-yoga: 5.16.0(graphql@16.11.0) '@graphql-yoga/subscription@3.1.0': dependencies: @@ -15679,26 +15219,18 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@9.4.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/momoa@2.0.4': {} '@humanwhocodes/retry@0.4.3': {} - '@inquirer/external-editor@1.0.2(@types/node@20.19.14)': + '@inquirer/external-editor@1.0.2(@types/node@20.19.19)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@isaacs/balanced-match@4.0.1': {} @@ -15735,14 +15267,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.14 + '@types/node': 20.19.19 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.14 + '@types/node': 20.19.19 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -15776,7 +15308,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -15884,7 +15416,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 - '@types/node': 20.19.14 + '@types/node': 20.19.19 find-up: 4.1.0 fs-extra: 8.1.0 @@ -15970,57 +15502,57 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.3(supports-color@9.4.0) - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.3(supports-color@9.4.0) - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.12 chalk: 4.1.2 debug: 4.4.3(supports-color@9.4.0) fs-extra: 10.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -16028,58 +15560,38 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@4.0.0(289f3c00e3d6307750c136f270e09d49)': + '@nomicfoundation/hardhat-toolbox@4.0.0(6b332ee552128839aebadf34f365d923)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 - '@types/node': 20.19.14 + '@types/node': 20.19.19 chai: 4.5.0 - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) - typescript: 5.9.2 - - '@nomicfoundation/hardhat-toolbox@4.0.0(319f36fa853933d46d380da2276493de)': - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2)) - '@types/chai': 4.3.20 - '@types/mocha': 9.1.1 - '@types/node': 20.19.14 - chai: 4.5.0 - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) - typescript: 5.9.2 + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) + typescript: 5.9.3 - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.4.3(supports-color@9.4.0) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -16088,13 +15600,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.4.3(supports-color@9.4.0) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -16160,12 +15672,12 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 @@ -16173,7 +15685,7 @@ snapshots: chalk: 2.4.2 debug: 4.4.3(supports-color@9.4.0) fs-extra: 7.0.1 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash: 4.17.21 semver: 6.3.1 table: 6.9.0 @@ -16181,21 +15693,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 - ethereum-waffle: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + ethereum-waffle: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 - ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2) + ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) '@npmcli/agent@2.2.2': dependencies: @@ -16250,7 +15762,7 @@ snapshots: '@openzeppelin/defender-sdk-base-client@2.7.0(encoding@0.1.13)': dependencies: - '@aws-sdk/client-lambda': 3.888.0 + '@aws-sdk/client-lambda': 3.901.0 amazon-cognito-identity-js: 6.3.15(encoding@0.1.13) async-retry: 1.3.3 transitivePeerDependencies: @@ -16282,17 +15794,17 @@ snapshots: '@openzeppelin/defender-deploy-client-cli': 0.0.1-alpha.10(encoding@0.1.13) '@openzeppelin/upgrades-core': 1.44.1 - '@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.3)(encoding@0.1.13) '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.3)(encoding@0.1.13) '@openzeppelin/upgrades-core': 1.44.1 chalk: 4.1.2 debug: 4.4.3(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) proper-lockfile: 4.1.2 transitivePeerDependencies: - encoding @@ -16346,8 +15858,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} - '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -16377,9 +15887,9 @@ snapshots: '@react-native/dev-middleware': 0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) debug: 4.4.3(supports-color@9.4.0) invariant: 2.2.4 - metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.83.1 + metro: 0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-config: 0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-core: 0.83.3 semver: 7.7.2 transitivePeerDependencies: - bufferutil @@ -16412,12 +15922,12 @@ snapshots: '@react-native/normalize-colors@0.81.4': {} - '@react-native/virtualized-lists@0.81.4(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1)': + '@react-native/virtualized-lists@0.81.4(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))(react@19.2.0)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 19.1.1 - react-native: 0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10) + react: 19.2.0 + react-native: 0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10) '@repeaterjs/repeater@3.0.4': {} @@ -16592,227 +16102,225 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.1.1': + '@smithy/abort-controller@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/config-resolver@4.2.2': + '@smithy/config-resolver@4.3.0': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 - '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.1 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@smithy/core@3.11.0': - dependencies: - '@smithy/middleware-serde': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-stream': 4.3.1 - '@smithy/util-utf8': 4.1.0 - '@types/uuid': 9.0.8 + '@smithy/core@3.14.0': + dependencies: + '@smithy/middleware-serde': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.2.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.4.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - uuid: 9.0.1 - '@smithy/credential-provider-imds@4.1.2': + '@smithy/credential-provider-imds@4.2.0': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/property-provider': 4.1.1 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 tslib: 2.8.1 - '@smithy/eventstream-codec@4.1.1': + '@smithy/eventstream-codec@4.2.0': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.5.0 - '@smithy/util-hex-encoding': 4.1.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.1.1': + '@smithy/eventstream-serde-browser@4.2.0': dependencies: - '@smithy/eventstream-serde-universal': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/eventstream-serde-universal': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.2.1': + '@smithy/eventstream-serde-config-resolver@4.3.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.1.1': + '@smithy/eventstream-serde-node@4.2.0': dependencies: - '@smithy/eventstream-serde-universal': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/eventstream-serde-universal': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.1.1': + '@smithy/eventstream-serde-universal@4.2.0': dependencies: - '@smithy/eventstream-codec': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/eventstream-codec': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.2.1': + '@smithy/fetch-http-handler@5.3.0': dependencies: - '@smithy/protocol-http': 5.2.1 - '@smithy/querystring-builder': 4.1.1 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.2.0 tslib: 2.8.1 - '@smithy/hash-node@4.1.1': + '@smithy/hash-node@4.2.0': dependencies: - '@smithy/types': 4.5.0 - '@smithy/util-buffer-from': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/types': 4.6.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.1.1': + '@smithy/invalid-dependency@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.1.0': + '@smithy/is-array-buffer@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.1.1': + '@smithy/middleware-content-length@4.2.0': dependencies: - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.2': + '@smithy/middleware-endpoint@4.3.0': dependencies: - '@smithy/core': 3.11.0 - '@smithy/middleware-serde': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-middleware': 4.1.1 + '@smithy/core': 3.14.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-retry@4.2.2': + '@smithy/middleware-retry@4.4.0': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/protocol-http': 5.2.1 - '@smithy/service-error-classification': 4.1.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@types/uuid': 9.0.8 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - uuid: 9.0.1 - '@smithy/middleware-serde@4.1.1': + '@smithy/middleware-serde@4.2.0': dependencies: - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.1.1': + '@smithy/middleware-stack@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.2.2': + '@smithy/node-config-provider@4.3.0': dependencies: - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.2.1': + '@smithy/node-http-handler@4.3.0': dependencies: - '@smithy/abort-controller': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/querystring-builder': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/abort-controller': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/property-provider@4.1.1': + '@smithy/property-provider@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/protocol-http@5.2.1': + '@smithy/protocol-http@5.3.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.1.1': + '@smithy/querystring-builder@4.2.0': dependencies: - '@smithy/types': 4.5.0 - '@smithy/util-uri-escape': 4.1.0 + '@smithy/types': 4.6.0 + '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.1.1': + '@smithy/querystring-parser@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.1.1': + '@smithy/service-error-classification@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 - '@smithy/shared-ini-file-loader@4.2.0': + '@smithy/shared-ini-file-loader@4.3.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/signature-v4@5.2.1': + '@smithy/signature-v4@5.3.0': dependencies: - '@smithy/is-array-buffer': 4.1.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-hex-encoding': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-uri-escape': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.2': + '@smithy/smithy-client@4.7.0': dependencies: - '@smithy/core': 3.11.0 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-stack': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-stream': 4.3.1 + '@smithy/core': 3.14.0 + '@smithy/middleware-endpoint': 4.3.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.4.0 tslib: 2.8.1 - '@smithy/types@4.5.0': + '@smithy/types@4.6.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.1.1': + '@smithy/url-parser@4.2.0': dependencies: - '@smithy/querystring-parser': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/querystring-parser': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-base64@4.1.0': + '@smithy/util-base64@4.2.0': dependencies: - '@smithy/util-buffer-from': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.1.0': + '@smithy/util-body-length-browser@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.1.0': + '@smithy/util-body-length-node@4.2.0': dependencies: tslib: 2.8.1 @@ -16821,66 +16329,66 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.1.0': + '@smithy/util-buffer-from@4.2.0': dependencies: - '@smithy/is-array-buffer': 4.1.0 + '@smithy/is-array-buffer': 4.2.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.1.0': + '@smithy/util-config-provider@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.2': + '@smithy/util-defaults-mode-browser@4.2.0': dependencies: - '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.1.2': + '@smithy/util-defaults-mode-node@4.2.0': dependencies: - '@smithy/config-resolver': 4.2.2 - '@smithy/credential-provider-imds': 4.1.2 - '@smithy/node-config-provider': 4.2.2 - '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.1.2': + '@smithy/util-endpoints@3.2.0': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.1.0': + '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.1.1': + '@smithy/util-middleware@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-retry@4.1.1': + '@smithy/util-retry@4.2.0': dependencies: - '@smithy/service-error-classification': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-stream@4.3.1': + '@smithy/util-stream@4.4.0': dependencies: - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/node-http-handler': 4.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 - '@smithy/util-buffer-from': 4.1.0 - '@smithy/util-hex-encoding': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/fetch-http-handler': 5.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.2.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-uri-escape@4.1.0': + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 @@ -16889,17 +16397,26 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.1.0': + '@smithy/util-utf8@4.2.0': dependencies: - '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-buffer-from': 4.2.0 tslib: 2.8.1 - '@smithy/util-waiter@4.1.1': + '@smithy/util-waiter@4.2.0': dependencies: - '@smithy/abort-controller': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/abort-controller': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.2 + text-hex: 1.0.0 + '@solidity-parser/parser@0.14.5': dependencies: antlr4ts: 0.5.0-alpha.4 @@ -16920,7 +16437,7 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tenderly/api-client@1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)': + '@tenderly/api-client@1.1.0(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)': dependencies: axios: 0.27.2 cli-table3: 0.6.5 @@ -16929,26 +16446,26 @@ snapshots: js-yaml: 4.1.0 open: 8.4.2 prompts: 2.4.2 - tslog: 4.9.3 + tslog: 4.10.2 optionalDependencies: - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) - typescript: 5.9.2 + ts-node: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - debug - '@tenderly/hardhat-integration@1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-integration@1.1.1(@types/node@20.19.19)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@tenderly/api-client': 1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2) + '@tenderly/api-client': 1.1.0(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3) axios: 1.12.2(debug@4.4.3) dotenv: 16.6.1 fs-extra: 10.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-deploy: 0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10) npm-registry-fetch: 17.1.0 semver: 7.7.2 - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) - tslog: 4.9.3 - typescript: 5.9.2 + ts-node: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) + tslog: 4.10.2 + typescript: 5.9.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -16958,14 +16475,14 @@ snapshots: - supports-color - utf-8-validate - '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.19.19)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@ethersproject/bignumber': 5.8.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@openzeppelin/hardhat-upgrades': 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@openzeppelin/hardhat-upgrades': 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/upgrades-core': 1.44.1 - '@tenderly/hardhat-integration': 1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@tenderly/hardhat-integration': 1.1.1(@types/node@20.19.19)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) dotenv: 16.6.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -16993,56 +16510,56 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2)': + '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.9.2) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) - typescript: 5.9.2 + ts-essentials: 7.0.3(typescript@5.9.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) + typescript: 5.9.3 - '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2)': + '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.9.2) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) - typescript: 5.9.2 + ts-essentials: 7.0.3(typescript@5.9.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) + typescript: 5.9.3 - '@typechain/ethers-v5@2.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.9.2))': + '@typechain/ethers-v5@2.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.9.3))': dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - typechain: 3.0.0(typescript@5.9.2) + typechain: 3.0.0(typescript@5.9.3) - '@typechain/ethers-v6@0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2)': + '@typechain/ethers-v6@0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.9.2) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) - typescript: 5.9.2 + ts-essentials: 7.0.3(typescript@5.9.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) + typescript: 5.9.3 - '@typechain/hardhat@6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))': + '@typechain/hardhat@6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) '@types/abstract-leveldown@7.2.5': {} @@ -17069,17 +16586,17 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/bn.js@5.2.0': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/responselike': 1.0.3 optional: true @@ -17091,11 +16608,11 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/debug@4.1.12': dependencies: @@ -17105,21 +16622,21 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/http-cache-semantics@4.0.4': {} @@ -17145,7 +16662,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 optional: true '@types/level-errors@3.0.2': {} @@ -17154,11 +16671,7 @@ snapshots: dependencies: '@types/abstract-leveldown': 7.2.5 '@types/level-errors': 3.0.2 - '@types/node': 20.19.14 - - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.11 + '@types/node': 20.19.19 '@types/minimatch@5.1.2': {} @@ -17166,11 +16679,9 @@ snapshots: dependencies: minimatch: 10.0.3 - '@types/minimist@1.2.5': {} - '@types/mkdirp@0.5.2': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/mocha@10.0.10': {} @@ -17180,20 +16691,16 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 form-data: 4.0.4 - '@types/node@20.19.14': + '@types/node@20.19.19': dependencies: undici-types: 6.21.0 - '@types/normalize-package-data@2.4.4': {} - - '@types/parse-json@4.0.2': {} - '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/prettier@2.7.3': {} @@ -17201,16 +16708,16 @@ snapshots: '@types/resolve@0.0.8': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 optional: true - '@types/secp256k1@4.0.6': + '@types/secp256k1@4.0.7': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/sinon-chai@3.2.12': dependencies: @@ -17229,13 +16736,11 @@ snapshots: '@types/unist@2.0.11': {} - '@types/uuid@9.0.8': {} - '@types/validator@13.15.3': {} '@types/ws@8.18.1': dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/yargs-parser@21.0.3': {} @@ -17243,101 +16748,99 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.0 - '@typescript-eslint/type-utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.0 - eslint: 9.35.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.45.0 + eslint: 9.37.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.44.0 - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3(supports-color@9.4.0) - eslint: 9.35.0(jiti@2.5.1) - typescript: 5.9.2 + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.45.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) - '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 debug: 4.4.3(supports-color@9.4.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.44.0': + '@typescript-eslint/scope-manager@8.45.0': dependencies: - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/visitor-keys': 8.45.0 - '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3(supports-color@9.4.0) - eslint: 9.35.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + eslint: 9.37.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.44.0': {} + '@typescript-eslint/types@8.45.0': {} - '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/project-service': 8.45.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3(supports-color@9.4.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.44.0 - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) - typescript: 5.9.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.44.0': + '@typescript-eslint/visitor-keys@8.45.0': dependencies: - '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/types': 8.45.0 eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.0': {} - '@urql/core@2.4.4(graphql@16.3.0)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.3.0) @@ -17361,17 +16864,17 @@ snapshots: graphql: 16.8.0 wonka: 6.3.5 - '@wagmi/cli@2.5.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@wagmi/cli@2.6.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) - bundle-require: 5.1.0(esbuild@0.25.9) + abitype: 1.1.1(typescript@5.9.3)(zod@4.1.11) + bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 change-case: 5.4.4 chokidar: 4.0.1 dedent: 0.7.0 dotenv: 16.6.1 dotenv-expand: 10.0.0 - esbuild: 0.25.9 + esbuild: 0.25.10 escalade: 3.2.0 fdir: 6.5.0(picomatch@3.0.1) nanospinner: 1.2.2 @@ -17379,10 +16882,10 @@ snapshots: picocolors: 1.1.1 picomatch: 3.0.1 prettier: 3.6.2 - viem: 2.37.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - zod: 3.25.76 + viem: 2.37.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) + zod: 4.1.11 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -17405,9 +16908,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@whatwg-node/fetch@0.10.10': + '@whatwg-node/fetch@0.10.11': dependencies: - '@whatwg-node/node-fetch': 0.7.25 + '@whatwg-node/node-fetch': 0.8.0 urlpattern-polyfill: 10.1.0 '@whatwg-node/fetch@0.8.8': @@ -17426,7 +16929,7 @@ snapshots: fast-url-parser: 1.1.3 tslib: 2.8.1 - '@whatwg-node/node-fetch@0.7.25': + '@whatwg-node/node-fetch@0.8.0': dependencies: '@fastify/busboy': 3.2.0 '@whatwg-node/disposablestack': 0.0.6 @@ -17441,7 +16944,7 @@ snapshots: dependencies: '@envelop/instrumentation': 1.0.0 '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/fetch': 0.10.10 + '@whatwg-node/fetch': 0.10.11 '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 @@ -17459,16 +16962,15 @@ snapshots: abbrev@1.0.9: {} - abitype@0.7.1(typescript@5.9.2)(zod@3.25.76): - dependencies: - typescript: 5.9.2 + abitype@1.1.0(typescript@5.9.3)(zod@4.1.11): optionalDependencies: - zod: 3.25.76 + typescript: 5.9.3 + zod: 4.1.11 - abitype@1.1.0(typescript@5.9.2)(zod@3.25.76): + abitype@1.1.1(typescript@5.9.3)(zod@4.1.11): optionalDependencies: - typescript: 5.9.2 - zod: 3.25.76 + typescript: 5.9.3 + zod: 4.1.11 abort-controller@3.0.0: dependencies: @@ -17543,6 +17045,10 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv-errors@1.0.1(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -17593,7 +17099,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.1.0: + ansi-escapes@7.1.1: dependencies: environment: 1.1.0 @@ -17638,9 +17144,9 @@ snapshots: aproba@1.2.0: optional: true - arbos-precompiles@1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10): + arbos-precompiles@1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -17648,8 +17154,6 @@ snapshots: - typescript - utf-8-validate - are-docs-informative@0.0.2: {} - are-we-there-yet@1.1.7: dependencies: delegates: 1.0.0 @@ -17759,8 +17263,6 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@1.0.1: {} - asap@2.0.6: {} asn1.js@4.10.1: @@ -17794,7 +17296,7 @@ snapshots: async-eventemitter@0.2.4: dependencies: - async: 2.6.4 + async: 2.6.2 async-function@1.0.0: {} @@ -17814,10 +17316,6 @@ snapshots: dependencies: lodash: 4.17.21 - async@2.6.4: - dependencies: - lodash: 4.17.21 - async@3.2.6: {} asynckit@0.4.0: {} @@ -18388,7 +17886,7 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 - baseline-browser-mapping@2.8.4: {} + baseline-browser-mapping@2.8.12: {} basic-auth@2.0.1: dependencies: @@ -18400,6 +17898,15 @@ snapshots: bech32@1.1.4: {} + better-ajv-errors@2.0.2(ajv@6.12.6): + dependencies: + '@babel/code-frame': 7.27.1 + '@humanwhocodes/momoa': 2.0.4 + ajv: 6.12.6 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -18420,16 +17927,16 @@ snapshots: bip39@2.5.0: dependencies: create-hash: 1.2.0 - pbkdf2: 3.1.3 + pbkdf2: 3.1.5 randombytes: 2.1.0 safe-buffer: 5.2.1 unorm: 1.6.0 bip39@3.0.4: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 create-hash: 1.2.0 - pbkdf2: 3.1.3 + pbkdf2: 3.1.5 randombytes: 2.1.0 bl@4.1.0: @@ -18587,7 +18094,7 @@ snapshots: browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 - cipher-base: 1.0.6 + cipher-base: 1.0.7 create-hash: 1.2.0 evp_bytestokey: 1.0.3 inherits: 2.0.4 @@ -18602,7 +18109,7 @@ snapshots: browserify-des@1.0.2: dependencies: - cipher-base: 1.0.6 + cipher-base: 1.0.7 des.js: 1.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 @@ -18615,32 +18122,31 @@ snapshots: safe-buffer: 5.2.1 optional: true - browserify-sign@4.2.3: + browserify-sign@4.2.5: dependencies: bn.js: 5.2.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 elliptic: 6.6.1 - hash-base: 3.0.5 inherits: 2.0.4 - parse-asn1: 5.1.7 + parse-asn1: 5.1.9 readable-stream: 2.3.8 safe-buffer: 5.2.1 optional: true browserslist@3.2.8: dependencies: - caniuse-lite: 1.0.30001741 - electron-to-chromium: 1.5.218 + caniuse-lite: 1.0.30001748 + electron-to-chromium: 1.5.230 - browserslist@4.26.0: + browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.4 - caniuse-lite: 1.0.30001741 - electron-to-chromium: 1.5.218 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.0) + baseline-browser-mapping: 2.8.12 + caniuse-lite: 1.0.30001748 + electron-to-chromium: 1.5.230 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) bs58@4.0.1: dependencies: @@ -18693,9 +18199,9 @@ snapshots: dependencies: node-gyp-build: 4.8.4 - bundle-require@5.1.0(esbuild@0.25.9): + bundle-require@5.1.0(esbuild@0.25.10): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 load-tsconfig: 0.2.5 busboy@1.6.0: @@ -18803,16 +18309,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - caller-callsite@2.0.0: - dependencies: - callsites: 2.0.0 - - caller-path@2.0.0: - dependencies: - caller-callsite: 2.0.0 - - callsites@2.0.0: {} - callsites@3.1.0: {} camel-case@4.1.2: @@ -18820,12 +18316,6 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - camelcase@3.0.0: {} camelcase@4.1.0: {} @@ -18834,7 +18324,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001741: {} + caniuse-lite@1.0.30001748: {} capital-case@1.0.4: dependencies: @@ -18935,16 +18425,10 @@ snapshots: change-case@5.4.4: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} - character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} - character-reference-invalid@2.0.1: {} chardet@0.7.0: {} @@ -19003,7 +18487,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -19012,7 +18496,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -19034,10 +18518,11 @@ snapshots: multihashes: 0.4.21 optional: true - cipher-base@1.0.6: + cipher-base@1.0.7: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.2 class-is@1.1.0: optional: true @@ -19084,12 +18569,7 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 - cli-truncate@4.0.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 - - cli-truncate@5.0.0: + cli-truncate@5.1.0: dependencies: slice-ansi: 7.1.2 string-width: 8.1.0 @@ -19152,29 +18632,29 @@ snapshots: dependencies: color-name: 1.1.4 + color-convert@3.1.2: + dependencies: + color-name: 2.0.2 + color-name@1.1.3: {} color-name@1.1.4: {} - color-string@1.9.1: + color-name@2.0.2: {} + + color-string@2.1.2: dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 + color-name: 2.0.2 - color@3.2.1: + color@5.0.2: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-convert: 3.1.2 + color-string: 2.1.2 colorette@2.0.20: {} colors@1.4.0: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -19219,8 +18699,6 @@ snapshots: commander@9.5.0: {} - comment-parser@1.4.1: {} - common-tags@1.8.2: {} compare-func@2.0.0: @@ -19283,34 +18761,14 @@ snapshots: content-type@1.0.5: {} - conventional-changelog-angular@5.0.13: - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - conventional-changelog-conventionalcommits@4.6.3: - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - conventional-changelog-conventionalcommits@7.0.2: dependencies: compare-func: 2.0.0 - conventional-commits-parser@3.2.4: - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 @@ -19349,55 +18807,30 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@2.0.2(@types/node@20.19.14)(cosmiconfig@7.1.0)(typescript@5.9.2): + cosmiconfig-typescript-loader@6.1.0(@types/node@20.19.19)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 20.19.14 - cosmiconfig: 7.1.0 - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + '@types/node': 20.19.19 + cosmiconfig: 9.0.0(typescript@5.9.3) + jiti: 2.6.1 + typescript: 5.9.3 - cosmiconfig-typescript-loader@6.1.0(@types/node@20.19.14)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): - dependencies: - '@types/node': 20.19.14 - cosmiconfig: 9.0.0(typescript@5.9.2) - jiti: 2.5.1 - typescript: 5.9.2 - - cosmiconfig@5.2.1: - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - cosmiconfig@8.3.6(typescript@5.9.2): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - cosmiconfig@9.0.0(typescript@5.9.2): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 crc-32@1.2.2: {} @@ -19407,27 +18840,20 @@ snapshots: elliptic: 6.6.1 optional: true - create-hash@1.1.3: - dependencies: - cipher-base: 1.0.6 - inherits: 2.0.4 - ripemd160: 2.0.1 - sha.js: 2.4.12 - create-hash@1.2.0: dependencies: - cipher-base: 1.0.6 + cipher-base: 1.0.7 inherits: 2.0.4 md5.js: 1.3.5 - ripemd160: 2.0.2 + ripemd160: 2.0.3 sha.js: 2.4.12 create-hmac@1.1.7: dependencies: - cipher-base: 1.0.6 + cipher-base: 1.0.7 create-hash: 1.2.0 inherits: 2.0.4 - ripemd160: 2.0.2 + ripemd160: 2.0.3 safe-buffer: 5.2.1 sha.js: 2.4.12 @@ -19487,13 +18913,13 @@ snapshots: crypto-browserify@3.12.0: dependencies: browserify-cipher: 1.0.1 - browserify-sign: 4.2.3 + browserify-sign: 4.2.5 create-ecdh: 4.0.4 create-hash: 1.2.0 create-hmac: 1.1.7 diffie-hellman: 5.0.3 inherits: 2.0.4 - pbkdf2: 3.1.3 + pbkdf2: 3.1.5 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 @@ -19504,8 +18930,6 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 - dargs@7.0.0: {} - dargs@8.1.0: {} dashdash@1.14.1: @@ -19534,6 +18958,8 @@ snapshots: dataloader@2.2.3: {} + dayjs@1.11.18: {} + dayjs@1.11.7: {} death@1.1.0: {} @@ -19568,17 +18994,10 @@ snapshots: optionalDependencies: supports-color: 9.4.0 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - decamelize@1.2.0: {} decamelize@4.0.0: {} - decimal.js@10.6.0: {} - decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -19684,6 +19103,8 @@ snapshots: dependency-graph@0.11.0: {} + dependency-graph@1.0.0: {} + dequal@2.0.3: {} des.js@1.1.0: @@ -19696,8 +19117,6 @@ snapshots: destroy@1.2.0: {} - detect-file@1.0.0: {} - detect-indent@4.0.0: dependencies: repeating: 2.0.1 @@ -19743,10 +19162,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-walk@0.1.2: {} dot-case@3.0.4: @@ -19795,7 +19210,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.218: {} + electron-to-chromium@1.5.230: {} elliptic@6.5.4: dependencies: @@ -19985,34 +19400,34 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild@0.25.9: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -20033,9 +19448,9 @@ snapshots: optionalDependencies: source-map: 0.2.0 - eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.5.1)): + eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.1)): dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -20045,17 +19460,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.37.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -20064,9 +19479,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.37.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -20078,51 +19493,23 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@50.8.0(eslint@9.35.0(jiti@2.5.1)): - dependencies: - '@es-joy/jsdoccomment': 0.50.2 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.4.3(supports-color@9.4.0) - escape-string-regexp: 4.0.0 - eslint: 9.35.0(jiti@2.5.1) - espree: 10.4.0 - esquery: 1.6.0 - parse-imports-exports: 0.2.4 - semver: 7.7.2 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-markdown@5.1.0(eslint@9.35.0(jiti@2.5.1)): - dependencies: - eslint: 9.35.0(jiti@2.5.1) - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-simple-import-sort@12.1.1(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.37.0(jiti@2.6.1)): dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1)): dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) eslint-scope@8.4.0: dependencies: @@ -20133,59 +19520,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@9.4.0) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - eslint@9.35.0(jiti@2.5.1): + eslint@9.37.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.35.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -20214,7 +19558,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -20231,12 +19575,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@2.7.3: {} esprima@4.0.1: {} @@ -20393,7 +19731,7 @@ snapshots: ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.2 - '@types/secp256k1': 4.0.6 + '@types/secp256k1': 4.0.7 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 @@ -20401,7 +19739,7 @@ snapshots: create-hmac: 1.1.7 hash.js: 1.1.7 keccak: 3.0.4 - pbkdf2: 3.1.3 + pbkdf2: 3.1.5 randombytes: 2.1.0 safe-buffer: 5.2.1 scrypt-js: 3.0.1 @@ -20422,10 +19760,10 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10): + ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@ethereum-waffle/chai': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@ethereum-waffle/compiler': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@ethereum-waffle/compiler': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) '@ethereum-waffle/mock-contract': 3.4.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -20436,15 +19774,15 @@ snapshots: - typescript - utf-8-validate - ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.2): + ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3): dependencies: '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2))(typescript@5.9.2) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) solc: 0.8.15 - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -20756,25 +20094,12 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 20.19.14 - aes-js: 4.0.0-beta.5 - tslib: 2.7.0 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@types/node': 20.19.14 + '@types/node': 20.19.19 aes-js: 4.0.0-beta.5 tslib: 2.7.0 ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -20851,20 +20176,8 @@ snapshots: merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 expand-brackets@0.1.5: dependencies: @@ -20889,10 +20202,6 @@ snapshots: expand-template@2.0.3: optional: true - expand-tilde@2.0.2: - dependencies: - homedir-polyfill: 1.0.3 - exponential-backoff@3.1.2: {} express@4.17.3: @@ -21061,14 +20370,6 @@ snapshots: fast-diff@1.3.0: {} - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -21154,10 +20455,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -21268,19 +20565,6 @@ snapshots: dependencies: micromatch: 4.0.8 - findup-sync@5.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -21385,12 +20669,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.2: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs-extra@4.0.3: dependencies: graceful-fs: 4.2.11 @@ -21512,6 +20790,8 @@ snapshots: wide-align: 1.1.5 optional: true + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@1.0.3: {} @@ -21558,8 +20838,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@8.0.1: {} - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -21577,14 +20855,6 @@ snapshots: chalk: 2.4.2 node-emoji: 1.11.0 - git-raw-commits@2.0.11: - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - git-raw-commits@4.0.0: dependencies: dargs: 8.1.0 @@ -21676,28 +20946,10 @@ snapshots: dependencies: ini: 4.1.1 - global-dirs@0.1.1: - dependencies: - ini: 1.3.8 - - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - global-prefix@3.0.0: dependencies: ini: 1.3.8 @@ -21709,10 +20961,6 @@ snapshots: min-document: 2.19.0 process: 0.11.10 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} globals@16.4.0: {} @@ -21841,16 +21089,16 @@ snapshots: lru-cache: 7.18.3 tslib: 2.8.1 - graphql-yoga@5.15.2(graphql@16.11.0): + graphql-yoga@5.16.0(graphql@16.11.0): dependencies: - '@envelop/core': 5.3.1 + '@envelop/core': 5.3.2 '@envelop/instrumentation': 1.0.0 '@graphql-tools/executor': 1.4.9(graphql@16.11.0) '@graphql-tools/schema': 10.0.25(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@graphql-yoga/logger': 2.0.1 '@graphql-yoga/subscription': 5.0.5 - '@whatwg-node/fetch': 0.10.10 + '@whatwg-node/fetch': 0.10.11 '@whatwg-node/promise-helpers': 1.3.2 '@whatwg-node/server': 0.10.12 dset: 3.1.4 @@ -21882,19 +21130,17 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 - hard-rejection@2.1.0: {} - - hardhat-abi-exporter@2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + hardhat-abi-exporter@2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 delete-empty: 3.0.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat-contract-sizer@2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + hardhat-contract-sizer@2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 hardhat-deploy@0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10): @@ -21928,7 +21174,7 @@ snapshots: - supports-color - utf-8-validate - hardhat-deploy@0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-deploy@0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 @@ -21948,7 +21194,7 @@ snapshots: debug: 4.4.3(supports-color@9.4.0) form-data: 3.0.4 fs-extra: 9.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) match-all: 1.2.7 murmur-128: 0.2.1 qs: 6.14.0 @@ -21957,11 +21203,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -21969,48 +21215,48 @@ snapshots: - debug - utf-8-validate - hardhat-secure-accounts@0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-storage-layout@0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + hardhat-storage-layout@0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: console-table-printer: 2.14.6 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10): + hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -22052,14 +21298,14 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) - typescript: 5.9.2 + ts-node: 10.9.2(@types/node@20.19.19)(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10): + hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -22101,8 +21347,8 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 8.10.2(typescript@5.9.2) - typescript: 5.9.2 + ts-node: 8.10.2(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - supports-color @@ -22160,21 +21406,12 @@ snapshots: has@1.0.4: {} - hash-base@2.0.2: - dependencies: - inherits: 2.0.4 - - hash-base@3.0.5: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - optional: true - - hash-base@3.1.0: + hash-base@3.1.2: dependencies: inherits: 2.0.4 - readable-stream: 3.6.2 + readable-stream: 2.3.8 safe-buffer: 5.2.1 + to-buffer: 1.2.2 hash-it@6.0.0: {} @@ -22206,10 +21443,16 @@ snapshots: hermes-estree@0.29.1: {} + hermes-estree@0.32.0: {} + hermes-parser@0.29.1: dependencies: hermes-estree: 0.29.1 + hermes-parser@0.32.0: + dependencies: + hermes-estree: 0.32.0 + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -22221,16 +21464,8 @@ snapshots: os-homedir: 1.0.2 os-tmpdir: 1.0.2 - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - hosted-git-info@2.8.9: {} - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -22274,7 +21509,7 @@ snapshots: http-response-object@3.0.2: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 http-signature@1.2.0: dependencies: @@ -22311,8 +21546,6 @@ snapshots: human-signals@2.1.0: {} - human-signals@5.0.0: {} - husky@7.0.4: {} husky@9.1.7: {} @@ -22355,11 +21588,6 @@ snapshots: immutable@4.3.7: {} - import-fresh@2.0.0: - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 - import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -22439,15 +21667,8 @@ snapshots: dependencies: hasown: 2.0.2 - is-alphabetical@1.0.4: {} - is-alphabetical@2.0.1: {} - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 @@ -22466,8 +21687,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.4: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -22520,8 +21739,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-decimal@1.0.4: {} - is-decimal@2.0.1: {} is-descriptor@0.1.7: @@ -22534,8 +21751,6 @@ snapshots: is-accessor-descriptor: 1.0.1 is-data-descriptor: 1.0.1 - is-directory@0.3.1: {} - is-docker@2.2.1: {} is-dotfile@1.0.3: {} @@ -22578,9 +21793,10 @@ snapshots: is-function@1.0.2: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -22595,8 +21811,6 @@ snapshots: is-hex-prefixed@1.0.0: {} - is-hexadecimal@1.0.4: {} - is-hexadecimal@2.0.1: {} is-lambda@1.0.1: {} @@ -22628,10 +21842,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - - is-plain-obj@1.1.0: {} - is-plain-obj@2.1.0: {} is-plain-object@2.0.4: @@ -22668,8 +21878,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@3.0.0: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -22685,10 +21893,6 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-text-path@1.0.1: - dependencies: - text-extensions: 1.9.0 - is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 @@ -22792,7 +21996,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.14 + '@types/node': 20.19.19 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -22802,7 +22006,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.19.14 + '@types/node': 20.19.19 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -22829,7 +22033,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.14 + '@types/node': 20.19.19 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -22837,7 +22041,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.14 + '@types/node': 20.19.19 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -22854,12 +22058,12 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.5.1: {} + jiti@2.6.1: {} js-cookie@2.2.1: {} @@ -22886,10 +22090,6 @@ snapshots: jsc-safe-url@0.2.4: {} - jsdoc-type-pratt-parser@4.1.0: {} - - jsel@1.1.6: {} - jsesc@0.5.0: {} jsesc@1.3.0: {} @@ -22907,8 +22107,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-better-errors@1.0.2: {} - json-parse-even-better-errors@2.3.1: {} json-pointer@0.6.2: @@ -22999,7 +22197,7 @@ snapshots: json-schema: 0.4.0 verror: 1.10.0 - katex@0.16.22: + katex@0.16.23: dependencies: commander: 8.3.0 @@ -23202,8 +22400,6 @@ snapshots: lilconfig@2.0.5: {} - lilconfig@3.1.3: {} - lines-and-columns@1.2.4: {} linkify-it@5.0.0: @@ -23229,35 +22425,15 @@ snapshots: transitivePeerDependencies: - enquirer - lint-staged@15.5.2: - dependencies: - chalk: 5.6.2 - commander: 13.1.0 - debug: 4.4.3(supports-color@9.4.0) - execa: 8.0.1 - lilconfig: 3.1.3 - listr2: 8.3.3 - micromatch: 4.0.8 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.8.1 - transitivePeerDependencies: - - supports-color - - lint-staged@16.1.6: + lint-staged@16.2.3: dependencies: - chalk: 5.6.2 commander: 14.0.1 - debug: 4.4.3(supports-color@9.4.0) - lilconfig: 3.1.3 listr2: 9.0.4 micromatch: 4.0.8 nano-spawn: 1.0.3 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 - transitivePeerDependencies: - - supports-color listr2@4.0.5(enquirer@2.4.1): dependencies: @@ -23272,18 +22448,9 @@ snapshots: optionalDependencies: enquirer: 2.4.1 - listr2@8.3.3: - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 - listr2@9.0.4: dependencies: - cli-truncate: 5.0.0 + cli-truncate: 5.1.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.1.0 @@ -23375,7 +22542,7 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.1.0 + ansi-escapes: 7.1.1 cli-cursor: 5.0.0 slice-ansi: 7.1.2 strip-ansi: 7.1.2 @@ -23420,7 +22587,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.1: {} + lru-cache@11.2.2: {} lru-cache@3.2.0: dependencies: @@ -23472,10 +22639,6 @@ snapshots: map-cache@0.2.2: {} - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - map-visit@1.0.0: dependencies: object-visit: 1.0.1 @@ -23532,22 +22695,10 @@ snapshots: md5.js@1.3.5: dependencies: - hash-base: 3.1.0 + hash-base: 3.1.2 inherits: 2.0.4 safe-buffer: 5.2.1 - mdast-util-from-markdown@0.8.5: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-to-string@2.0.0: {} - mdurl@2.0.0: {} media-typer@0.3.0: {} @@ -23589,20 +22740,6 @@ snapshots: meow@12.1.1: {} - meow@8.1.2: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - merge-descriptors@1.0.1: {} merge-descriptors@1.0.3: @@ -23642,56 +22779,56 @@ snapshots: readable-stream: 3.6.2 semaphore-async-await: 1.5.1 - meros@1.3.2(@types/node@20.19.14): + meros@1.3.2(@types/node@20.19.19): optionalDependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 methods@1.1.2: {} - metro-babel-transformer@0.83.1: + metro-babel-transformer@0.83.3: dependencies: '@babel/core': 7.28.4 flow-enums-runtime: 0.0.6 - hermes-parser: 0.29.1 + hermes-parser: 0.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.83.1: + metro-cache-key@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.83.1: + metro-cache@0.83.3: dependencies: exponential-backoff: 3.1.2 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.83.1 + metro-core: 0.83.3 transitivePeerDependencies: - supports-color - metro-config@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-config@0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: connect: 3.7.0 - cosmiconfig: 5.2.1 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-cache: 0.83.1 - metro-core: 0.83.1 - metro-runtime: 0.83.1 + metro: 0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-cache: 0.83.3 + metro-core: 0.83.3 + metro-runtime: 0.83.3 + yaml: 2.8.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.83.1: + metro-core@0.83.3: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.83.1 + metro-resolver: 0.83.3 - metro-file-map@0.83.1: + metro-file-map@0.83.3: dependencies: debug: 4.4.3(supports-color@9.4.0) fb-watchman: 2.0.2 @@ -23705,47 +22842,47 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.83.1: + metro-minify-terser@0.83.3: dependencies: flow-enums-runtime: 0.0.6 terser: 5.44.0 - metro-resolver@0.83.1: + metro-resolver@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.83.1: + metro-runtime@0.83.3: dependencies: '@babel/runtime': 7.28.4 flow-enums-runtime: 0.0.6 - metro-source-map@0.83.1: + metro-source-map@0.83.3: dependencies: '@babel/traverse': 7.28.4 '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.4' '@babel/types': 7.28.4 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.83.1 + metro-symbolicate: 0.83.3 nullthrows: 1.1.1 - ob1: 0.83.1 + ob1: 0.83.3 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.83.1: + metro-symbolicate@0.83.3: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.83.1 + metro-source-map: 0.83.3 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.83.1: + metro-transform-plugins@0.83.3: dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -23756,27 +22893,27 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-transform-worker@0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 '@babel/types': 7.28.4 flow-enums-runtime: 0.0.6 - metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-babel-transformer: 0.83.1 - metro-cache: 0.83.1 - metro-cache-key: 0.83.1 - metro-minify-terser: 0.83.1 - metro-source-map: 0.83.1 - metro-transform-plugins: 0.83.1 + metro: 0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-minify-terser: 0.83.3 + metro-source-map: 0.83.3 + metro-transform-plugins: 0.83.3 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro@0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -23793,24 +22930,24 @@ snapshots: error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 - hermes-parser: 0.29.1 + hermes-parser: 0.32.0 image-size: 1.2.1 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.1 - metro-cache: 0.83.1 - metro-cache-key: 0.83.1 - metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.83.1 - metro-file-map: 0.83.1 - metro-resolver: 0.83.1 - metro-runtime: 0.83.1 - metro-source-map: 0.83.1 - metro-symbolicate: 0.83.1 - metro-transform-plugins: 0.83.1 - metro-transform-worker: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -23894,7 +23031,7 @@ snapshots: dependencies: '@types/katex': 0.16.7 devlop: 1.1.0 - katex: 0.16.22 + katex: 0.16.23 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 @@ -23985,13 +23122,6 @@ snapshots: micromark-util-types@2.0.2: {} - micromark@2.11.4: - dependencies: - debug: 4.4.3(supports-color@9.4.0) - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - micromark@4.0.2: dependencies: '@types/debug': 4.1.12 @@ -24070,8 +23200,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} - mimic-function@5.0.1: {} mimic-response@1.0.1: @@ -24088,8 +23216,6 @@ snapshots: dependencies: dom-walk: 0.1.2 - min-indent@1.0.1: {} - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -24110,12 +23236,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@0.0.8: {} minimist@1.2.8: {} @@ -24428,7 +23548,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.21: {} + node-releases@2.0.23: {} nofilter@3.1.0: {} @@ -24446,13 +23566,6 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.16.1 - semver: 7.7.2 - validate-npm-package-license: 3.0.4 - normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 @@ -24495,10 +23608,6 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - npmlog@4.1.2: dependencies: are-we-there-yet: 1.1.7 @@ -24518,7 +23627,7 @@ snapshots: oauth-sign@0.9.0: {} - ob1@0.83.1: + ob1@0.83.3: dependencies: flow-enums-runtime: 0.0.6 @@ -24534,6 +23643,8 @@ snapshots: object-inspect@1.12.3: {} + object-inspect@1.13.2: {} + object-inspect@1.13.4: {} object-is@1.1.6: @@ -24628,10 +23739,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -24691,18 +23798,18 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.9.3(typescript@5.9.2)(zod@3.25.76): + ox@0.9.6(typescript@5.9.3)(zod@4.1.11): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) + abitype: 1.1.0(typescript@5.9.3)(zod@4.1.11) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - zod @@ -24795,27 +23902,17 @@ snapshots: dependencies: callsites: 3.1.0 - parse-asn1@5.1.7: + parse-asn1@5.1.9: dependencies: asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 - hash-base: 3.0.5 - pbkdf2: 3.1.3 + pbkdf2: 3.1.5 safe-buffer: 5.2.1 optional: true parse-cache-control@1.0.1: {} - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -24841,19 +23938,10 @@ snapshots: parse-headers@2.0.6: {} - parse-imports-exports@0.2.4: - dependencies: - parse-statements: 1.0.11 - parse-json@2.2.0: dependencies: error-ex: 1.3.4 - parse-json@4.0.0: - dependencies: - error-ex: 1.3.4 - json-parse-better-errors: 1.0.2 - parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 @@ -24861,10 +23949,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-passwd@1.0.0: {} - - parse-statements@1.0.11: {} - parseurl@1.3.3: {} pascal-case@3.1.2: @@ -24931,8 +24015,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-root-regex@0.1.2: {} @@ -24948,7 +24030,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.2.1 + lru-cache: 11.2.2 minipass: 7.1.2 path-starts-with@2.0.1: {} @@ -24970,14 +24052,14 @@ snapshots: pathval@1.1.1: {} - pbkdf2@3.1.3: + pbkdf2@3.1.5: dependencies: - create-hash: 1.1.3 + create-hash: 1.2.0 create-hmac: 1.1.7 - ripemd160: 2.0.1 + ripemd160: 2.0.3 safe-buffer: 5.2.1 sha.js: 2.4.12 - to-buffer: 1.2.1 + to-buffer: 1.2.2 pegjs@0.10.0: {} @@ -25118,7 +24200,7 @@ snapshots: pump: 3.0.3 rc: 1.2.8 simple-get: 3.1.1 - tar-fs: 2.1.3 + tar-fs: 2.1.4 tunnel-agent: 0.6.0 which-pm-runs: 1.1.0 optional: true @@ -25136,7 +24218,7 @@ snapshots: pump: 3.0.3 rc: 1.2.8 simple-get: 3.1.1 - tar-fs: 2.1.3 + tar-fs: 2.1.4 tunnel-agent: 0.6.0 optional: true @@ -25158,6 +24240,8 @@ snapshots: prettier: 3.6.2 semver: 7.7.2 + prettier@2.8.8: {} + prettier@3.6.2: {} pretty-format@29.7.0: @@ -25166,17 +24250,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-quick@4.2.2(prettier@3.6.2): - dependencies: - '@pkgr/core': 0.2.9 - ignore: 7.0.5 - mri: 1.2.0 - picocolors: 1.1.1 - picomatch: 4.0.3 - prettier: 3.6.2 - tinyexec: 0.3.2 - tslib: 2.8.1 - private@0.1.8: {} proc-log@4.2.0: {} @@ -25248,7 +24321,7 @@ snapshots: bn.js: 4.12.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 - parse-asn1: 5.1.7 + parse-asn1: 5.1.9 randombytes: 2.1.0 safe-buffer: 5.2.1 optional: true @@ -25305,8 +24378,6 @@ snapshots: pvutils@1.1.3: {} - q@1.5.1: {} - qs@6.11.0: dependencies: side-channel: 1.1.0 @@ -25343,8 +24414,6 @@ snapshots: quick-format-unescaped@4.0.4: {} - quick-lru@4.0.1: {} - quick-lru@5.1.1: {} randomatic@3.1.1: @@ -25410,15 +24479,15 @@ snapshots: react-is@18.3.1: {} - react-native-fs@2.20.0(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)): + react-native-fs@2.20.0(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10)): dependencies: base-64: 0.1.0 - react-native: 0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10) utf8: 3.0.0 react-native-path@0.0.5: {} - react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10): + react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.4 @@ -25427,7 +24496,7 @@ snapshots: '@react-native/gradle-plugin': 0.81.4 '@react-native/js-polyfills': 0.81.4 '@react-native/normalize-colors': 0.81.4 - '@react-native/virtualized-lists': 0.81.4(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) + '@react-native/virtualized-lists': 0.81.4(react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.2.0)(utf-8-validate@5.0.10))(react@19.2.0) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -25440,12 +24509,12 @@ snapshots: invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.83.1 - metro-source-map: 0.83.1 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 - react: 19.1.1 + react: 19.2.0 react-devtools-core: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 @@ -25465,32 +24534,19 @@ snapshots: react-refresh@0.14.2: {} - react@19.1.1: {} + react@19.2.0: {} read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 read-pkg: 1.1.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - read-pkg@1.1.0: dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -25552,11 +24608,6 @@ snapshots: dependencies: minimatch: 3.1.2 - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - reduce-flatten@2.0.0: {} reflect.getprototypeof@1.0.10: @@ -25681,21 +24732,12 @@ snapshots: resolve-alpn@1.2.1: {} - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - resolve-from@3.0.0: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve-global@1.0.0: - dependencies: - global-dirs: 0.1.1 - resolve-url@0.2.1: {} resolve@1.1.7: {} @@ -25756,18 +24798,13 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@5.0.10: + rimraf@5.0.5: dependencies: glob: 10.4.5 - ripemd160@2.0.1: - dependencies: - hash-base: 2.0.2 - inherits: 2.0.4 - - ripemd160@2.0.2: + ripemd160@2.0.3: dependencies: - hash-base: 3.1.0 + hash-base: 3.1.2 inherits: 2.0.4 rlp@2.2.6: @@ -25859,7 +24896,7 @@ snapshots: scryptsy@1.2.1: dependencies: - pbkdf2: 3.1.3 + pbkdf2: 3.1.5 optional: true secp256k1@4.0.4: @@ -25884,10 +24921,6 @@ snapshots: semver@6.3.1: {} - semver@7.3.7: - dependencies: - lru-cache: 6.0.0 - semver@7.7.2: {} send@0.17.2: @@ -26085,7 +25118,7 @@ snapshots: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - to-buffer: 1.2.1 + to-buffer: 1.2.2 sha1@1.1.1: dependencies: @@ -26163,10 +25196,6 @@ snapshots: simple-concat: 1.0.1 optional: true - simple-swizzle@0.2.4: - dependencies: - is-arrayish: 0.3.4 - simple-wcswidth@1.1.2: {} sisteransi@1.0.5: {} @@ -26248,23 +25277,6 @@ snapshots: sol-explore@1.6.1: {} - solc-typed-ast@18.2.4(typescript@5.9.2)(zod@3.25.76): - dependencies: - axios: 1.12.2(debug@4.4.3) - commander: 12.1.0 - decimal.js: 10.6.0 - findup-sync: 5.0.0 - fs-extra: 11.3.2 - jsel: 1.1.6 - semver: 7.7.2 - solc: 0.8.25 - src-location: 1.1.0 - web3-eth-abi: 4.4.1(typescript@5.9.2)(zod@3.25.76) - transitivePeerDependencies: - - debug - - typescript - - zod - solc@0.4.26: dependencies: fs-extra: 0.30.0 @@ -26296,18 +25308,6 @@ snapshots: transitivePeerDependencies: - debug - solc@0.8.25: - dependencies: - command-exists: 1.2.9 - commander: 8.3.0 - follow-redirects: 1.15.11(debug@4.4.3) - js-sha3: 0.8.0 - memorystream: 0.3.1 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - solc@0.8.26(debug@4.4.3): dependencies: command-exists: 1.2.9 @@ -26320,15 +25320,17 @@ snapshots: transitivePeerDependencies: - debug - solhint@5.1.0(typescript@5.9.2): + solhint@6.0.1(typescript@5.9.3): dependencies: '@solidity-parser/parser': 0.20.2 ajv: 6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) antlr4: 4.13.2 ast-parents: 0.0.1 + better-ajv-errors: 2.0.2(ajv@6.12.6) chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.2 @@ -26337,17 +25339,16 @@ snapshots: lodash: 4.17.21 pluralize: 8.0.0 semver: 7.7.2 - strip-ansi: 6.0.1 table: 6.9.0 text-table: 0.2.0 optionalDependencies: - prettier: 3.6.2 + prettier: 2.8.8 transitivePeerDependencies: - typescript solidity-ast@0.4.61: {} - solidity-coverage@0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.2 @@ -26358,7 +25359,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -26370,10 +25371,10 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-docgen@0.6.0-beta.36(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): + solidity-docgen@0.6.0-beta.36(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: handlebars: 4.7.8 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) solidity-ast: 0.4.61 solium-plugin-security@0.1.1(solium@1.2.5): @@ -26458,11 +25459,6 @@ snapshots: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.22 - spdx-expression-parse@4.0.0: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.22: {} split-string@3.1.0: @@ -26481,8 +25477,6 @@ snapshots: sprintf-js@1.0.3: {} - src-location@1.1.0: {} - sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -26638,16 +25632,10 @@ snapshots: strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} - strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -26747,7 +25735,7 @@ snapshots: resolve: 1.22.10 string.prototype.trim: 1.2.10 - tar-fs@2.1.3: + tar-fs@2.1.4: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -26810,8 +25798,6 @@ snapshots: testrpc@0.0.1: {} - text-extensions@1.9.0: {} - text-extensions@2.4.0: {} text-hex@1.0.0: {} @@ -26822,7 +25808,7 @@ snapshots: dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 - '@types/node': 20.19.14 + '@types/node': 20.19.19 '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 @@ -26857,9 +25843,9 @@ snapshots: timed-out@4.0.1: optional: true - tiny-lru@8.0.2: {} + tiny-lru@11.4.5: {} - tinyexec@0.3.2: {} + tiny-lru@8.0.2: {} tinyexec@1.0.1: {} @@ -26882,7 +25868,7 @@ snapshots: tmpl@1.0.5: {} - to-buffer@1.2.1: + to-buffer@1.2.2: dependencies: isarray: 2.0.5 safe-buffer: 5.2.1 @@ -26924,8 +25910,6 @@ snapshots: tr46@0.0.3: {} - trim-newlines@3.0.1: {} - trim-right@1.0.1: {} triple-beam@1.4.1: {} @@ -26942,9 +25926,9 @@ snapshots: ts-algebra@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 ts-command-line-args@2.5.1: dependencies: @@ -26955,13 +25939,13 @@ snapshots: ts-essentials@1.0.4: {} - ts-essentials@6.0.7(typescript@5.9.2): + ts-essentials@6.0.7(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-essentials@7.0.3(typescript@5.9.2): + ts-essentials@7.0.3(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 ts-generator@0.1.1: dependencies: @@ -26971,35 +25955,35 @@ snapshots: chalk: 2.4.2 glob: 7.2.3 mkdirp: 0.5.6 - prettier: 3.6.2 + prettier: 2.8.8 resolve: 1.22.10 ts-essentials: 1.0.4 - ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2): + ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.14 + '@types/node': 20.19.19 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@8.10.2(typescript@5.9.2): + ts-node@8.10.2(typescript@5.9.3): dependencies: arg: 4.1.3 diff: 4.0.2 make-error: 1.3.6 source-map-support: 0.5.21 - typescript: 5.9.2 + typescript: 5.9.3 yn: 3.1.1 tsconfig-paths@3.15.0: @@ -27021,11 +26005,13 @@ snapshots: tslib@2.5.3: {} + tslib@2.6.2: {} + tslib@2.7.0: {} tslib@2.8.1: {} - tslog@4.9.3: {} + tslog@4.10.2: {} tsort@0.0.1: {} @@ -27051,18 +26037,12 @@ snapshots: type-detect@4.1.0: {} - type-fest@0.18.1: {} - type-fest@0.20.2: {} type-fest@0.21.3: {} - type-fest@0.6.0: {} - type-fest@0.7.1: {} - type-fest@0.8.1: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -27070,20 +26050,20 @@ snapshots: type@2.7.3: {} - typechain@3.0.0(typescript@5.9.2): + typechain@3.0.0(typescript@5.9.3): dependencies: command-line-args: 4.0.7 debug: 4.4.3(supports-color@9.4.0) fs-extra: 7.0.1 js-sha3: 0.8.0 lodash: 4.17.21 - ts-essentials: 6.0.7(typescript@5.9.2) + ts-essentials: 6.0.7(typescript@5.9.3) ts-generator: 0.1.1 transitivePeerDependencies: - supports-color - typescript - typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2): + typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3): dependencies: '@types/prettier': 2.7.3 debug: 4.4.3(supports-color@9.4.0) @@ -27092,10 +26072,10 @@ snapshots: js-sha3: 0.8.0 lodash: 4.17.21 mkdirp: 1.0.4 - prettier: 3.6.2 + prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.9.2) - typescript: 5.9.2 + ts-essentials: 7.0.3(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -27138,18 +26118,18 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript@5.9.2: {} + typescript@5.9.3: {} typewise-core@1.2.0: {} @@ -27216,10 +26196,6 @@ snapshots: dependencies: imurmurhash: 0.1.4 - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.11 - universalify@0.1.2: {} universalify@2.0.1: {} @@ -27237,9 +26213,9 @@ snapshots: has-value: 0.3.1 isobject: 3.0.1 - update-browserslist-db@1.1.3(browserslist@4.26.0): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.26.0 + browserslist: 4.26.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -27310,14 +26286,6 @@ snapshots: object.getownpropertydescriptors: 2.1.8 safe-array-concat: 1.1.3 - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.0 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - utils-merge@1.0.1: {} uuid@3.3.2: @@ -27327,8 +26295,6 @@ snapshots: uuid@8.3.2: {} - uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -27353,18 +26319,18 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - viem@2.37.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.37.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) + abitype: 1.1.0(typescript@5.9.3)(zod@4.1.11) isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.9.3(typescript@5.9.2)(zod@3.25.76) + ox: 0.9.6(typescript@5.9.3)(zod@4.1.11) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -27380,7 +26346,7 @@ snapshots: web3-bzz@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 got: 9.6.0 swarm-js: 0.1.42(bufferutil@4.0.9)(utf-8-validate@5.0.10) underscore: 1.9.1 @@ -27433,7 +26399,7 @@ snapshots: web3-core@1.2.11: dependencies: '@types/bn.js': 4.11.6 - '@types/node': 20.19.14 + '@types/node': 20.19.19 bignumber.js: 9.3.1 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -27443,10 +26409,6 @@ snapshots: - supports-color optional: true - web3-errors@1.3.1: - dependencies: - web3-types: 1.10.0 - web3-eth-abi@1.2.11: dependencies: '@ethersproject/abi': 5.0.0-beta.153 @@ -27454,17 +26416,6 @@ snapshots: web3-utils: 1.2.11 optional: true - web3-eth-abi@4.4.1(typescript@5.9.2)(zod@3.25.76): - dependencies: - abitype: 0.7.1(typescript@5.9.2)(zod@3.25.76) - web3-errors: 1.3.1 - web3-types: 1.10.0 - web3-utils: 4.3.3 - web3-validator: 2.0.6 - transitivePeerDependencies: - - typescript - - zod - web3-eth-accounts@1.2.11: dependencies: crypto-browserify: 3.12.0 @@ -27520,7 +26471,7 @@ snapshots: web3-eth-personal@1.2.11: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 web3-core: 1.2.11 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -27619,8 +26570,6 @@ snapshots: - supports-color optional: true - web3-types@1.10.0: {} - web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 @@ -27644,22 +26593,6 @@ snapshots: utf8: 3.0.0 optional: true - web3-utils@4.3.3: - dependencies: - ethereum-cryptography: 2.2.1 - eventemitter3: 5.0.1 - web3-errors: 1.3.1 - web3-types: 1.10.0 - web3-validator: 2.0.6 - - web3-validator@2.0.6: - dependencies: - ethereum-cryptography: 2.2.1 - util: 0.12.5 - web3-errors: 1.3.1 - web3-types: 1.10.0 - zod: 3.25.76 - web3@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: web3-bzz: 1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -27721,7 +26654,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -27763,7 +26696,7 @@ snapshots: wide-align@1.1.5: dependencies: - string-width: 1.0.2 + string-width: 4.2.3 optional: true widest-line@3.1.0: @@ -27778,10 +26711,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.17.0: + winston@3.18.3: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + '@dabh/diagnostics': 2.0.8 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -27794,7 +26727,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 20.19.14 + '@types/node': 20.19.19 wonka@4.0.15: {} @@ -28066,3 +26999,5 @@ snapshots: zod: 3.25.76 zod@3.25.76: {} + + zod@4.1.11: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 62c1ded10..72f175133 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,60 @@ packages: - - 'packages/*' - - 'packages/contracts/test' - - 'packages/contracts/task' + - packages/* + - packages/*/* + +catalog: + '@changesets/cli': ^2.29.7 + '@commitlint/cli': ^20.1.0 + '@commitlint/config-conventional': ^20.0.0 + '@eslint/js': ^9.37.0 + '@graphprotocol/sdk': ^0.6.1 + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.1.0 + '@nomicfoundation/hardhat-foundry': ^1.1.1 + '@nomicfoundation/hardhat-ignition': 0.15.9 + '@nomicfoundation/hardhat-ignition-ethers': 0.15.9 + '@nomicfoundation/hardhat-network-helpers': ^1.0.9 + '@nomicfoundation/hardhat-toolbox': ^5.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.10 + '@nomicfoundation/ignition-core': 0.15.9 + '@openzeppelin/contracts': ^5.3.0 + '@typechain/ethers-v5': ^10.2.1 + '@typechain/hardhat': ^9.0.0 + '@types/debug': ^4.1.12 + '@types/json5': ^2.2.0 + '@types/node': ^20.17.50 + '@typescript-eslint/eslint-plugin': ^8.45.0 + '@typescript-eslint/parser': ^8.45.0 + '@wagmi/cli': ^2.3.1 + chai: ^4.2.0 + debug: ^4.4.0 + dotenv: ^16.5.0 + eslint: ^9.37.0 + eslint-config-prettier: ^10.1.5 + eslint-plugin-import: ^2.32.0 + eslint-plugin-no-only-tests: ^3.3.0 + eslint-plugin-simple-import-sort: ^12.1.1 + eslint-plugin-unused-imports: ^4.2.0 + ethers: ^6.15.0 + glob: ^11.0.2 + globals: ^16.4.0 + hardhat: ^2.26.0 + hardhat-contract-sizer: ^2.10.0 + hardhat-dependency-compiler: ^1.2.1 + hardhat-gas-reporter: ^1.0.8 + hardhat-secure-accounts: ^1.0.5 + hardhat-storage-layout: ^0.1.7 + husky: ^9.1.7 + json5: ^2.2.3 + lint-staged: ^16.0.0 + markdownlint-cli: ^0.45.0 + mocha: ^11.7.1 + prettier: ^3.6.2 + prettier-plugin-solidity: ^2.0.0 + solhint: ^6.0.1 + ts-node: ^10.9.2 + typechain: ^8.3.2 + typescript: ^5.9.3 + typescript-eslint: ^8.45.0 + viem: ^2.31.7 + yaml-lint: ^1.7.0 diff --git a/remappings.txt b/remappings.txt deleted file mode 100644 index 349436e0c..000000000 --- a/remappings.txt +++ /dev/null @@ -1,2 +0,0 @@ -@graphprotocol/interfaces/=packages/interfaces/ -@openzeppelin/=node_modules/@openzeppelin/ diff --git a/scripts/calculate-storage-locations.js b/scripts/calculate-storage-locations.js deleted file mode 100644 index bad26c5bb..000000000 --- a/scripts/calculate-storage-locations.js +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env node - -/** - * This script calculates the storage locations for ERC-7201 namespaced storage. - * - * Usage: - * node calculate-storage-locations.js "graphprotocol.storage.ContractName" - * node calculate-storage-locations.js --contract ContractName - */ - -// Import the shared storage location utilities -const { - getNamespace, - getStorageStructName, - getStorageLocationName, - getStorageGetterName, - getNamespacedStorageLocation, - getERC7201FormulaComment, - keccak256, -} = require('./utils/storage-locations') - -// If run directly from command line -if (require.main === module) { - // Check if using --contract flag - if (process.argv[2] === '--contract') { - const contractName = process.argv[3] - - if (!contractName) { - console.error('Please provide a contract name.') - console.error('Example: node calculate-storage-locations.js --contract ContractName') - process.exit(1) - } - - const namespace = getNamespace(contractName) - const location = getNamespacedStorageLocation(namespace) - const structName = getStorageStructName(contractName) - const getterName = getStorageGetterName(contractName) - const formulaComment = getERC7201FormulaComment(namespace) - - console.log(`Contract Name: ${contractName}`) - console.log(`Namespace: ${namespace}`) - console.log(`Storage Location: ${location}`) - console.log('\nSolidity code:') - console.log(`/// @custom:storage-location erc7201:${namespace}`) - console.log(`struct ${structName} {`) - console.log(' // Add your storage variables here') - console.log('}') - console.log(`\nfunction ${getterName}() private pure returns (${structName} storage $) {`) - console.log( - ` // This value was calculated using: node scripts/calculate-storage-locations.js --contract ${contractName}`, - ) - console.log(` ${formulaComment}`) - console.log(' assembly {') - console.log(` $.slot := ${location}`) - console.log(' }') - console.log('}') - } else { - const namespace = process.argv[2] - - if (!namespace) { - console.error('Please provide a namespace as an argument.') - console.error('Example: node calculate-storage-locations.js "graphprotocol.storage.ContractName"') - console.error('Or: node calculate-storage-locations.js --contract ContractName') - process.exit(1) - } - - const location = getNamespacedStorageLocation(namespace) - const contractName = namespace.split('.').pop() - const formulaComment = getERC7201FormulaComment(namespace) - - console.log(`Namespace: ${namespace}`) - console.log(`Storage Location: ${location}`) - console.log('\nSolidity code:') - console.log(`function _get${contractName}Storage() private pure returns (${contractName}Data storage $) {`) - console.log(` // This value was calculated using: node scripts/calculate-storage-locations.js "${namespace}"`) - console.log(` ${formulaComment}`) - console.log(' assembly {') - console.log(` $.slot := ${location}`) - console.log(' }') - console.log('}') - } -} - -// Re-export the shared utilities for backward compatibility -module.exports = { - getNamespace, - getStorageStructName, - getStorageLocationName, - getStorageGetterName, - getNamespacedStorageLocation, - getERC7201FormulaComment, - keccak256, -} diff --git a/scripts/check-todos.sh b/scripts/check-todos.sh new file mode 100755 index 000000000..8bdb825f4 --- /dev/null +++ b/scripts/check-todos.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# Check for TODO comments in Solidity files +# Can run during lint-staged (pre-commit) or regular linting (changed files only) + +# Exit on any error +set -e + +# Determine if we're running in lint-staged context or regular linting +LINT_STAGED_MODE=false +if [ "${LINT_STAGED:-}" = "true" ] || [ $# -gt 0 ]; then + LINT_STAGED_MODE=true +fi + +# If no files passed and not in lint-staged mode, check git changed files +if [ $# -eq 0 ] && [ "$LINT_STAGED_MODE" = false ]; then + # Get locally changed Solidity files (modified, added, but not committed) + CHANGED_FILES=$(git diff --name-only --diff-filter=AM HEAD | grep '\.sol$' || true) + # Get untracked Solidity files + UNTRACKED_FILES=$(git ls-files --others --exclude-standard | grep '\.sol$' || true) + # Combine both lists + ALL_FILES="$CHANGED_FILES $UNTRACKED_FILES" + if [ -z "$ALL_FILES" ]; then + echo "โœ… No locally changed or untracked Solidity files to check for TODO comments." + exit 0 + fi + # Convert to array + set -- $ALL_FILES +fi + +# Check if any files to process +if [ $# -eq 0 ]; then + echo "โœ… No files to check for TODO comments." + exit 0 +fi + +# Initialize flag to track if TODOs are found +TODO_FOUND=false + +# Check each file passed as argument +for file in "$@"; do + # Only check if file exists and is a Solidity file + if [ -f "$file" ] && [[ "$file" == *.sol ]]; then + # Search for TODO comments (case insensitive) + # Look for TODO, FIXME, XXX, HACK in comments + if grep -i -n -E "(//.*\b(todo|fixme|xxx|hack)\b|/\*.*\b(todo|fixme|xxx|hack)\b)" "$file" > /dev/null 2>&1; then + if [ "$TODO_FOUND" = false ]; then + echo "โŒ TODO comments found in Solidity files:" + echo "" + TODO_FOUND=true + fi + echo "๐Ÿ“ $file:" + # Show the actual lines with TODO comments + grep -i -n -E "(//.*\b(todo|fixme|xxx|hack)\b|/\*.*\b(todo|fixme|xxx|hack)\b)" "$file" | while read -r line; do + echo " $line" + done + echo "" + fi + fi +done + +# Exit with error if TODOs were found +if [ "$TODO_FOUND" = true ]; then + if [ "$LINT_STAGED_MODE" = true ]; then + echo "โŒ Please resolve all TODO comments in Solidity files before committing." + echo " This check runs during pre-commit to maintain code quality." + else + echo "โŒ TODO comments found in locally changed Solidity files." + echo " Consider resolving these before committing." + fi + exit 1 +fi + +if [ "$LINT_STAGED_MODE" = true ]; then + echo "โœ… No TODO comments found in Solidity files." +else + echo "โœ… No TODO comments found in locally changed Solidity files." +fi +exit 0 diff --git a/scripts/filter-natspec.js b/scripts/filter-natspec.js deleted file mode 100755 index be62903b8..000000000 --- a/scripts/filter-natspec.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node - -/** - * Filter out "return $ is missing" errors from natspec-smells output - * This script reads the natspec-smells output and filters out complete error blocks - * that contain "@return $ is missing" messages. - */ - -const { spawn } = require('child_process') - -// Run natspec-smells with the provided arguments -const args = process.argv.slice(2) -const natspecProcess = spawn('npx', ['natspec-smells', ...args], { - stdio: ['inherit', 'pipe', 'pipe'], -}) - -let output = '' -let errorOutput = '' - -natspecProcess.stdout.on('data', (data) => { - output += data.toString() -}) - -natspecProcess.stderr.on('data', (data) => { - errorOutput += data.toString() -}) - -natspecProcess.on('close', (_code) => { - // Combine stdout and stderr - const fullOutput = output + errorOutput - - // Check if the output is just "No issues found" - if (fullOutput.trim() === 'No issues found') { - console.log('No issues found') - process.exit(0) - return - } - - // Split into blocks (separated by empty lines) - const blocks = fullOutput.split(/\n\s*\n/) - - // Filter out blocks that contain "@return $ is missing" - const filteredBlocks = blocks.filter((block) => { - return !block.includes('@return $ is missing') - }) - - // Print filtered output - const filteredOutput = filteredBlocks.join('\n\n').trim() - if (filteredOutput) { - console.log(filteredOutput) - // Exit with error code if there are still issues (but not for "return $ is missing") - process.exit(1) - } else { - // No issues after filtering - process.exit(0) - } -}) - -natspecProcess.on('error', (err) => { - console.error('Error running natspec-smells:', err) - process.exit(1) -}) diff --git a/scripts/lint-staged-run.sh b/scripts/lint-staged-run.sh new file mode 100755 index 000000000..d65f16599 --- /dev/null +++ b/scripts/lint-staged-run.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Lint-staged runner script +# Runs linting commands while excluding specific generated files +# Usage: lint-staged-run.sh [file2] ... + +set -e + +if [ $# -lt 2 ]; then + echo "Usage: $0 [file2] ..." + echo "Example: $0 'eslint --fix --cache' file1.js file2.ts" + exit 1 +fi + +COMMAND="$1" +shift +FILES=("$@") + +# Define ignore patterns for generated files that should never be linted despite being in git +IGNORE_PATTERNS=( + "*/.graphclient-extracted/*" +) + +# Function to check if a file should be ignored +should_ignore_file() { + local file="$1" + + for pattern in "${IGNORE_PATTERNS[@]}"; do + if [[ "$file" == $pattern ]]; then + return 0 # Should ignore + fi + done + + return 1 # Should not ignore +} + +# Filter files +FILTERED_FILES=() +for file in "${FILES[@]}"; do + if ! should_ignore_file "$file"; then + FILTERED_FILES+=("$file") + fi +done + +# If no files to process, exit successfully +if [ ${#FILTERED_FILES[@]} -eq 0 ]; then + exit 0 +fi + +# Execute command with filtered files +exec $COMMAND "${FILTERED_FILES[@]}" diff --git a/scripts/utils/storage-locations.js b/scripts/utils/storage-locations.js deleted file mode 100644 index 035706e3c..000000000 --- a/scripts/utils/storage-locations.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Shared utilities for calculating ERC-7201 namespaced storage locations. - * This module provides the corrected algorithm that should be used by both - * calculate-storage-locations.js and verify-storage-slots.js scripts. - */ - -const { keccak_256 } = require('@noble/hashes/sha3') - -/** - * Generate a standard namespace for a contract - * @param {string} contractName - The name of the contract - * @returns {string} The namespace string - */ -function getNamespace(contractName) { - return `graphprotocol.storage.${contractName}` -} - -/** - * Generate a standard storage struct name - * @param {string} contractName - The name of the contract - * @returns {string} The struct name - */ -function getStorageStructName(contractName) { - return `${contractName}Data` -} - -/** - * Generate a standard storage location variable name - * @param {string} contractName - The name of the contract - * @returns {string} The variable name - */ -function getStorageLocationName(contractName) { - return `${contractName}StorageLocation` -} - -/** - * Generate a standard storage getter function name - * @param {string} contractName - The name of the contract - * @returns {string} The function name - */ -function getStorageGetterName(contractName) { - return `_get${contractName}Storage` -} - -/** - * Generate the ERC-7201 formula comment for a given namespace - * @param {string} namespace - The namespace string - * @returns {string} The formula comment - */ -function getERC7201FormulaComment(namespace) { - return `// keccak256(abi.encode(uint256(keccak256("${namespace}")) - 1)) & ~bytes32(uint256(0xff))` -} - -/** - * Calculate the storage slot for a namespace using ERC-7201 standard - * @param {string} namespace - The namespace string - * @returns {string} The storage slot - */ -function getNamespacedStorageLocation(namespace) { - // Calculate keccak256 hash of the namespace - const namespaceHash = keccak256(namespace) - - // Convert to BigInt, subtract 1 - const bn = BigInt(`0x${namespaceHash}`) - 1n - - // Convert back to hex - let hex = bn.toString(16) - if (hex.length % 2 !== 0) { - hex = '0' + hex - } - hex = '0x' + hex - - // Clear the last byte - const mask = BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00') - const cleared = (BigInt(hex) & mask).toString(16) - - return '0x' + cleared -} - -/** - * Ethereum keccak256 implementation using @noble/hashes - * This is the CORRECT implementation that matches Ethereum's keccak256, - * which is different from NIST SHA-3. - * @param {string} input - The input string - * @returns {string} The hash as a hex string - */ -function keccak256(input) { - const inputBytes = new TextEncoder().encode(input) - const hashBytes = keccak_256(inputBytes) - return Array.from(hashBytes, (byte) => byte.toString(16).padStart(2, '0')).join('') -} - -module.exports = { - getNamespace, - getStorageStructName, - getStorageLocationName, - getStorageGetterName, - getNamespacedStorageLocation, - getERC7201FormulaComment, - keccak256, -} diff --git a/scripts/verify-solhint-disables.js b/scripts/verify-solhint-disables.js new file mode 100755 index 000000000..d1cf437fa --- /dev/null +++ b/scripts/verify-solhint-disables.js @@ -0,0 +1,299 @@ +#!/usr/bin/env node + +const fs = require('fs') +const { execSync } = require('child_process') + +/** + * Extract solhint-disable rules from a file's TODO section + */ +function extractDisabledRules(filePath) { + const content = fs.readFileSync(filePath, 'utf8') + const lines = content.split('\n') + + let inTodoSection = false + let disabledRules = [] + + for (const line of lines) { + // Handle TODO pattern + if (line.includes('TODO: Re-enable and fix issues')) { + inTodoSection = true + continue + } + + if (inTodoSection && line.trim().startsWith('// solhint-disable ')) { + const rulesStr = line.replace('// solhint-disable ', '').trim().replace(/,$/, '') + disabledRules = rulesStr + .split(',') + .map((r) => r.trim()) + .filter((r) => r) + break + } + + if (inTodoSection && !line.trim().startsWith('//')) { + break + } + + // Handle standalone solhint-disable + if (!inTodoSection && line.trim().startsWith('// solhint-disable ')) { + const rulesStr = line.replace('// solhint-disable ', '').trim().replace(/,$/, '') + disabledRules = rulesStr + .split(',') + .map((rule) => rule.trim()) + .filter((rule) => rule.length > 0) + break + } + } + + return disabledRules.sort() +} + +/** + * Get actual solhint issues for a file by sending content without TODO section via stdin + */ +function getActualIssues(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf8') + + // Remove all lines starting with "// solhint-disable" + const cleanedLines = [] + + for (const line of content.split('\n')) { + if (!line.trim().startsWith('// solhint-disable ')) { + cleanedLines.push(line) + } + } + + const cleanedContent = cleanedLines.join('\n') + + // Write cleaned content to temporary file and run solhint from package root + const tempFile = filePath.replace('.sol', '.temp.sol') + fs.writeFileSync(tempFile, cleanedContent) + + try { + const result = execSync(`npx solhint ${tempFile} -f json`, { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'], + }) + + fs.unlinkSync(tempFile) // Clean up temp file + + const issues = JSON.parse(result) + const ruleIds = [...new Set(issues.map((issue) => issue.ruleId).filter((id) => id && id.trim()))].sort() + + return ruleIds + } catch (error) { + // Clean up temp file if it exists + if (fs.existsSync(tempFile)) { + fs.unlinkSync(tempFile) + } + console.error(`Error processing ${filePath}:`, error.message) + return [] + } + } catch (error) { + console.error(`Error reading ${filePath}:`, error.message) + return [] + } +} + +/** + * Fix disabled rules in a file + */ +function fixFile(filePath, actualIssues) { + const currentDisabledRules = extractDisabledRules(filePath) + + // Check if change is actually needed + const actualIssuesSorted = actualIssues.sort() + const currentRulesSorted = currentDisabledRules.sort() + + if (actualIssues.length === 0 && currentDisabledRules.length === 0) { + // Both empty - no change needed + return + } + + if ( + actualIssues.length > 0 && + actualIssuesSorted.length === currentRulesSorted.length && + actualIssuesSorted.every((rule, index) => rule === currentRulesSorted[index]) + ) { + // Rules match exactly - no change needed + return + } + const content = fs.readFileSync(filePath, 'utf8') + const lines = content.split('\n') + + const newLines = [] + let inTodoSection = false + let todoSectionEnded = false + let pragmaEndIndex = -1 + + // Find pragma end and TODO section + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + + if (line.trim().startsWith('pragma ')) { + pragmaEndIndex = i + } + + if (line.includes('TODO: Re-enable and fix issues')) { + inTodoSection = true + continue + } + + if (inTodoSection && line.trim().startsWith('// solhint-disable')) { + continue // Skip old disable line + } + + if (inTodoSection && !line.trim().startsWith('//')) { + todoSectionEnded = true // TODO section has ended (moved past comments) + } + + if (inTodoSection && todoSectionEnded && line.trim() !== '') { + inTodoSection = false // No longer in TODO section when we hit non-blank + } + + if (!inTodoSection) { + newLines.push(line) + } + } + + // If no issues, remove TODO section entirely + if (actualIssues.length === 0) { + fs.writeFileSync(filePath, newLines.join('\n')) + return + } + + // Insert new TODO section after last pragma, skipping any existing blank lines + let insertIndex = pragmaEndIndex + 1 + + // Skip existing blank lines after pragma + while (insertIndex < newLines.length && newLines[insertIndex].trim() === '') { + insertIndex++ + } + + const todoSection = [ + '// TODO: Re-enable and fix issues when publishing a new version', + `// solhint-disable ${actualIssues.join(', ')}`, + '', + ] + + newLines.splice(insertIndex, 0, ...todoSection) + + fs.writeFileSync(filePath, newLines.join('\n')) +} + +/** + * Process all files that need TODO sections + */ +function processAllFiles(shouldFix = false) { + const contractsDir = 'contracts' + + // Find all .sol files + const allFilesResult = execSync(`find ${contractsDir} -name "*.sol"`, { + encoding: 'utf8', + }) + + const allFiles = allFilesResult + .trim() + .split('\n') + .filter((f) => f) + + console.log(`Processing ${allFiles.length} Solidity files...\n`) + + let correctFiles = 0 + let incorrectFiles = 0 + let fixedFiles = 0 + let noIssuesFiles = 0 + + for (const filePath of allFiles) { + const actualIssues = getActualIssues(filePath) + const disabledRules = extractDisabledRules(filePath) + + const extraRules = disabledRules.filter((rule) => !actualIssues.includes(rule)) + const missingRules = actualIssues.filter((rule) => !disabledRules.includes(rule)) + const isCorrect = extraRules.length === 0 && missingRules.length === 0 + + if (actualIssues.length === 0 && disabledRules.length === 0) { + // File has no issues and no TODO section - perfect + console.log(`โœ… ${filePath} (no issues)`) + noIssuesFiles++ + correctFiles++ + } else if (actualIssues.length === 0 && disabledRules.length > 0) { + // File has no issues but has TODO section - should remove it + if (shouldFix) { + fixFile(filePath, actualIssues) + console.log(`๐Ÿ”ง ${filePath} - FIXED (removed unnecessary TODO)`) + fixedFiles++ + } else { + console.log(`โŒ ${filePath}`) + console.log(` Should remove TODO section (no issues)`) + console.log(` Currently: [${disabledRules.join(', ')}]`) + console.log() + incorrectFiles++ + } + } else if (isCorrect) { + console.log(`โœ… ${filePath}`) + correctFiles++ + } else { + if (shouldFix) { + fixFile(filePath, actualIssues) + console.log(`๐Ÿ”ง ${filePath} - FIXED`) + fixedFiles++ + } else { + console.log(`โŒ ${filePath}`) + + if (extraRules.length > 0) { + console.log(` Extra rules (not needed): ${extraRules.join(', ')}`) + } + + if (missingRules.length > 0) { + console.log(` Missing rules (needed): ${missingRules.join(', ')}`) + } + + if (actualIssues.length === 0) { + console.log(` Should remove TODO section (no issues)`) + } else { + console.log(` Should be: ${actualIssues.join(', ')}`) + } + + console.log(` Currently: [${disabledRules.join(', ')}]`) + console.log() + + incorrectFiles++ + } + } + } + + console.log(`\nSummary:`) + console.log(`โœ… Correct: ${correctFiles}`) + if (shouldFix) { + console.log(`๐Ÿ”ง Fixed: ${fixedFiles}`) + } else { + console.log(`โŒ Incorrect: ${incorrectFiles}`) + } + console.log(`๐Ÿ“„ No issues: ${noIssuesFiles}`) + console.log(`๐Ÿ“Š Total: ${allFiles.length}`) + + if (!shouldFix && incorrectFiles > 0) { + process.exit(1) + } +} + +/** + * Main function + */ +function main() { + const args = process.argv.slice(2) + const shouldFix = args.includes('--fix') + + if (shouldFix) { + console.log('๐Ÿ”ง FIXING MODE: Will automatically update disabled rules\n') + } else { + console.log('๐Ÿ” VERIFICATION MODE: Use --fix to automatically update disabled rules\n') + } + + processAllFiles(shouldFix) +} + +if (require.main === module) { + main() +} diff --git a/scripts/verify-storage-slots.js b/scripts/verify-storage-slots.js deleted file mode 100755 index b2a1ff11d..000000000 --- a/scripts/verify-storage-slots.js +++ /dev/null @@ -1,315 +0,0 @@ -#!/usr/bin/env node - -/** - * This script verifies that the storage slot hashes in Solidity contracts - * match the expected values calculated using the ERC-7201 namespaced storage pattern. - * - * Usage: - * node scripts/verify-storage-slots.js [options] [path/to/contracts] - * - * Options: - * --fix: Update incorrect hashes in the contracts - * --verbose: Show more detailed output - * path/to/contracts: Optional path to scan (defaults to checking all packages in the repo) - */ - -const fs = require('fs') -const path = require('path') - -// Import the shared storage location utilities -const { getNamespace, getNamespacedStorageLocation } = require('./utils/storage-locations') - -// Constants -const REPO_ROOT = path.resolve(__dirname, '..') -const STORAGE_LOCATION_REGEX = /\/\/\/ @custom:storage-location erc7201:graphprotocol\.storage\.([a-zA-Z0-9_]+)/ -const STORAGE_SLOT_REGEX = /\$\.slot := (0x[a-fA-F0-9]+)/ - -// Define standard package paths -const PACKAGE_PATHS = [ - path.resolve(REPO_ROOT, 'packages/issuance/contracts'), - path.resolve(REPO_ROOT, 'packages/contracts/contracts'), -] - -// Parse command line arguments -const args = process.argv.slice(2) -const shouldFix = args.includes('--fix') -const isVerbose = args.includes('--verbose') -const customPath = args.find((arg) => !arg.startsWith('--')) -const contractsPath = customPath ? path.resolve(process.cwd(), customPath) : null - -// Track results -const results = { - correct: [], - incorrect: [], - fixed: [], - errors: [], -} - -/** - * Find all Solidity files in a directory recursively - * @param {string} dir - Directory to search - * @returns {string[]} - Array of file paths - */ -function findSolidityFiles(dir) { - let results = [] - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const stat = fs.statSync(filePath) - - if (stat.isDirectory()) { - results = results.concat(findSolidityFiles(filePath)) - } else if (file.endsWith('.sol')) { - results.push(filePath) - } - } - - return results -} - -/** - * Extract contract information from a Solidity file - * @param {string} filePath - Path to the Solidity file - * @returns {Array<{contractName: string, currentHash: string, filePath: string, lineNumber: number}>} - Array of contract info objects - */ -function extractContractInfo(filePath) { - const content = fs.readFileSync(filePath, 'utf8') - const lines = content.split('\n') - const contracts = [] - - let currentContractName = null - - for (let i = 0; i < lines.length; i++) { - const line = lines[i] - - // Look for storage location annotation - const storageMatch = line.match(STORAGE_LOCATION_REGEX) - if (storageMatch) { - currentContractName = storageMatch[1] - continue - } - - // Look for storage slot hash - if (currentContractName) { - const slotMatch = line.match(STORAGE_SLOT_REGEX) - if (slotMatch) { - contracts.push({ - contractName: currentContractName, - currentHash: slotMatch[1], - filePath, - lineNumber: i + 1, - }) - currentContractName = null - } - } - } - - return contracts -} - -/** - * Verify the storage slot hash for a contract - * @param {Object} contract - Contract info object - * @returns {Object} - Result object with verification status - */ -function verifyStorageSlot(contract) { - const { contractName, currentHash } = contract - const namespace = getNamespace(contractName) - const expectedHash = getNamespacedStorageLocation(namespace) - - return { - ...contract, - namespace, - expectedHash, - isCorrect: currentHash.toLowerCase() === expectedHash.toLowerCase(), - } -} - -/** - * Fix the storage slot hash in a file - * @param {Object} contract - Contract info with verification result - * @returns {boolean} - Whether the fix was successful - */ -function fixStorageSlot(contract) { - const { filePath, currentHash, expectedHash } = contract - - try { - const content = fs.readFileSync(filePath, 'utf8') - const updatedContent = content.replace(currentHash, expectedHash) - - fs.writeFileSync(filePath, updatedContent, 'utf8') - return true - } catch (error) { - console.error(`Error fixing ${filePath}:`, error) - return false - } -} - -/** - * Process a single directory - * @param {string} dirPath - Path to the directory to process - * @returns {Object} - Results for this directory - */ -function processDirectory(dirPath) { - const dirResults = { - correct: [], - incorrect: [], - fixed: [], - errors: [], - } - - try { - // Find all Solidity files - const files = findSolidityFiles(dirPath) - if (isVerbose) { - console.log(`Found ${files.length} Solidity files`) - } - - // Extract and verify contract information - for (const file of files) { - try { - const contracts = extractContractInfo(file) - - for (const contract of contracts) { - const result = verifyStorageSlot(contract) - - if (result.isCorrect) { - dirResults.correct.push(result) - } else { - dirResults.incorrect.push(result) - - if (shouldFix) { - const fixed = fixStorageSlot(result) - if (fixed) { - dirResults.fixed.push(result) - } - } - } - } - } catch (error) { - if (isVerbose) { - console.error(`Error processing ${file}:`, error) - } - dirResults.errors.push({ file, error: error.message }) - } - } - - return dirResults - } catch (error) { - if (isVerbose) { - console.error(`Error processing directory ${dirPath}:`, error) - } - dirResults.errors.push({ file: dirPath, error: error.message }) - return dirResults - } -} - -/** - * Print results - * @param {Object} results - Results object - * @param {boolean} verbose - Whether to print verbose output - */ -function printResults(results, verbose) { - console.log('\n=== Storage Slot Verification Results ===\n') - - console.log(`โœ… Correct hashes: ${results.correct.length}`) - if (verbose || results.correct.length < 10) { - for (const contract of results.correct) { - console.log(` - ${contract.contractName}: ${contract.currentHash}`) - } - } else if (results.correct.length > 0) { - // Just show a few examples if there are many - console.log(` - ${results.correct[0].contractName}: ${results.correct[0].currentHash}`) - if (results.correct.length > 1) { - console.log(` - ${results.correct[1].contractName}: ${results.correct[1].currentHash}`) - } - console.log(` - ... and ${results.correct.length - 2} more`) - } - - console.log(`\nโŒ Incorrect hashes: ${results.incorrect.length}`) - for (const contract of results.incorrect) { - console.log(` - ${contract.contractName}:`) - console.log(` Current: ${contract.currentHash}`) - console.log(` Expected: ${contract.expectedHash}`) - console.log(` File: ${contract.filePath}:${contract.lineNumber}`) - } - - if (shouldFix) { - console.log(`\n๐Ÿ”ง Fixed hashes: ${results.fixed.length}`) - for (const contract of results.fixed) { - console.log(` - ${contract.contractName}: ${contract.currentHash} -> ${contract.expectedHash}`) - } - } - - if (results.errors.length > 0) { - console.log(`\nโš ๏ธ Errors: ${results.errors.length}`) - for (const error of results.errors) { - console.log(` - ${error.file}: ${error.error}`) - } - } -} - -/** - * Main function - */ -function main() { - try { - if (contractsPath) { - // Check a specific directory - console.log(`Scanning for Solidity contracts in: ${contractsPath}`) - - if (!fs.existsSync(contractsPath)) { - console.error(`Error: Directory not found: ${contractsPath}`) - process.exit(1) - } - - const dirResults = processDirectory(contractsPath) - - // Merge results - results.correct = results.correct.concat(dirResults.correct) - results.incorrect = results.incorrect.concat(dirResults.incorrect) - results.fixed = results.fixed.concat(dirResults.fixed) - results.errors = results.errors.concat(dirResults.errors) - } else { - // Check all packages by default - console.log('Checking all packages for storage slot hashes...') - - // Process each directory and combine results - for (const dirPath of PACKAGE_PATHS) { - if (fs.existsSync(dirPath)) { - console.log(`\nScanning for Solidity contracts in: ${dirPath}`) - const dirResults = processDirectory(dirPath) - - // Merge results - results.correct = results.correct.concat(dirResults.correct) - results.incorrect = results.incorrect.concat(dirResults.incorrect) - results.fixed = results.fixed.concat(dirResults.fixed) - results.errors = results.errors.concat(dirResults.errors) - } else if (isVerbose) { - console.log(`Directory not found: ${dirPath}`) - } - } - } - - // Print results - printResults(results, isVerbose) - - // Exit with appropriate code - if (results.incorrect.length > 0 && !shouldFix) { - console.log('\nโŒ Some storage slot hashes are incorrect. Run with --fix to update them.') - process.exit(1) - } else if (results.errors.length > 0) { - console.log('\nโš ๏ธ Completed with errors.') - process.exit(1) - } else { - console.log('\nโœ… All storage slot hashes are correct.') - process.exit(0) - } - } catch (error) { - console.error('Error:', error) - process.exit(1) - } -} - -main() diff --git a/tsconfig.json b/tsconfig.json index cb7bc39d9..9d236f5cc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es2020", - "module": "node16", + "target": "es2022", + "module": "Node16", "moduleResolution": "node16", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, @@ -14,6 +14,9 @@ "allowJs": true, "checkJs": false, "incremental": true, - "noEmitOnError": true + "noEmitOnError": true, + "paths": { + "@graphprotocol/*": ["./packages/*"] + } } } From 10db8fc093a91ed005335fa6053f8302bd78d903 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 6 Oct 2025 18:37:32 +0000 Subject: [PATCH 02/10] fix: update glob API usage for v11 compatibility - Replace deprecated GlobSync class with globSync function - Update import to use named import from glob package - Fixes TypeScript compilation errors in CI build --- .../contracts/arbitrum/AddressAliasHelper.sol | 9 +- .../contracts/arbitrum/IArbToken.sol | 10 + .../contracts/contracts/arbitrum/IBridge.sol | 83 ++++++- .../contracts/contracts/arbitrum/IInbox.sol | 83 ++++++- .../contracts/arbitrum/IMessageProvider.sol | 14 ++ .../contracts/contracts/arbitrum/IOutbox.sol | 57 +++++ .../contracts/arbitrum/ITokenGateway.sol | 29 ++- .../arbitrum/L1ArbitrumMessenger.sol | 62 +++++- .../arbitrum/L2ArbitrumMessenger.sol | 26 ++- .../contracts/bancor/BancorFormula.sol | 76 +++++-- .../contracts/contracts/base/IMulticall.sol | 1 + .../contracts/contracts/base/Multicall.sol | 9 +- .../contracts/contracts/curation/Curation.sol | 42 ++-- .../contracts/curation/CurationStorage.sol | 29 ++- .../contracts/curation/GraphCurationToken.sol | 13 +- .../contracts/curation/ICuration.sol | 3 +- .../curation/IGraphCurationToken.sol | 21 +- .../contracts/contracts/discovery/GNS.sol | 183 +++++++++------- .../contracts/discovery/GNSStorage.sol | 21 +- .../contracts/contracts/discovery/IGNS.sol | 16 +- .../contracts/discovery/IServiceRegistry.sol | 33 +++ .../contracts/discovery/ISubgraphNFT.sol | 44 +++- .../discovery/ISubgraphNFTDescriptor.sol | 6 +- .../contracts/contracts/discovery/L1GNS.sol | 25 ++- .../contracts/discovery/L1GNSStorage.sol | 6 +- .../contracts/discovery/ServiceRegistry.sol | 50 +++-- .../discovery/ServiceRegistryStorage.sol | 13 +- .../contracts/discovery/SubgraphNFT.sol | 77 ++++--- .../discovery/SubgraphNFTDescriptor.sol | 10 +- .../discovery/erc1056/EthereumDIDRegistry.sol | 174 +++++++++++++++ .../erc1056/IEthereumDIDRegistry.sol | 17 ++ .../contracts/disputes/DisputeManager.sol | 203 ++++++++++-------- .../disputes/DisputeManagerStorage.sol | 32 ++- .../contracts/disputes/IDisputeManager.sol | 120 ++++++++++- .../contracts/epochs/EpochManager.sol | 62 +++--- .../contracts/epochs/EpochManagerStorage.sol | 14 +- .../contracts/epochs/IEpochManager.sol | 47 ++++ .../contracts/gateway/BridgeEscrow.sol | 3 +- .../contracts/gateway/GraphTokenGateway.sol | 7 +- .../contracts/gateway/ICallhookReceiver.sol | 8 +- .../contracts/gateway/L1GraphTokenGateway.sol | 133 +++++++----- .../contracts/governance/Controller.sol | 46 ++-- .../contracts/governance/Governed.sol | 28 ++- .../contracts/governance/IController.sol | 50 +++++ .../contracts/governance/IManaged.sol | 12 +- .../contracts/governance/Managed.sol | 75 ++++--- .../contracts/governance/Pausable.sol | 38 +++- .../contracts/l2/curation/IL2Curation.sol | 2 + .../contracts/l2/curation/L2Curation.sol | 67 +++--- .../contracts/l2/discovery/IL2GNS.sol | 11 + .../contracts/l2/discovery/L2GNS.sol | 56 ++--- .../contracts/l2/discovery/L2GNSStorage.sol | 7 +- .../l2/gateway/L2GraphTokenGateway.sol | 79 ++++--- .../contracts/l2/staking/IL2Staking.sol | 1 + .../contracts/l2/staking/IL2StakingBase.sol | 10 + .../contracts/l2/staking/IL2StakingTypes.sol | 5 + .../contracts/l2/staking/L2Staking.sol | 21 +- .../l2/token/GraphTokenUpgradeable.sol | 28 ++- .../contracts/l2/token/L2GraphToken.sol | 45 ++-- .../contracts/libraries/Base58Encoder.sol | 39 +++- .../contracts/libraries/HexStrings.sol | 21 +- .../contracts/payments/AllocationExchange.sol | 64 ++++-- .../contracts/rewards/IRewardsIssuer.sol | 7 +- .../contracts/rewards/IRewardsManager.sol | 57 ----- .../contracts/rewards/RewardsManager.sol | 104 ++++----- .../rewards/RewardsManagerStorage.sol | 49 ++++- .../rewards/SubgraphAvailabilityManager.sol | 46 ++-- .../staking/IL1GraphTokenLockTransferTool.sol | 3 +- .../contracts/staking/IL1Staking.sol | 1 + .../contracts/staking/IL1StakingBase.sol | 33 ++- .../contracts/contracts/staking/IStaking.sol | 1 + .../contracts/staking/IStakingBase.sol | 85 ++++++-- .../contracts/staking/IStakingData.sol | 26 ++- .../contracts/staking/IStakingExtension.sol | 42 +++- .../contracts/contracts/staking/L1Staking.sol | 90 ++------ .../contracts/staking/L1StakingStorage.sol | 6 +- .../contracts/contracts/staking/Staking.sol | 192 ++++++----------- .../contracts/staking/StakingExtension.sol | 157 ++++---------- .../contracts/staking/StakingStorage.sol | 15 +- .../contracts/staking/libs/Exponential.sol | 3 +- .../contracts/staking/libs/IStakes.sol | 5 + .../contracts/staking/libs/LibFixedMath.sol | 111 +++++++--- .../contracts/staking/libs/MathUtils.sol | 19 +- .../contracts/staking/libs/Stakes.sol | 32 +-- .../contracts/tests/CallhookReceiverMock.sol | 22 +- .../contracts/tests/GovernedMock.sol | 9 +- .../L1GraphTokenLockTransferToolBadMock.sol | 32 ++- .../L1GraphTokenLockTransferToolMock.sol | 31 ++- .../contracts/tests/LegacyGNSMock.sol | 3 + .../tests/MockERC165OnlyContract.sol | 21 ++ .../contracts/tests/arbitrum/ArbSysMock.sol | 10 + .../contracts/tests/arbitrum/BridgeMock.sol | 57 +++-- .../contracts/tests/arbitrum/InboxMock.sol | 49 +++-- .../contracts/tests/arbitrum/OutboxMock.sol | 52 ++--- .../contracts/contracts/tests/ens/IENS.sol | 24 ++- .../contracts/tests/ens/IPublicResolver.sol | 19 ++ .../contracts/tests/ens/ITestRegistrar.sol | 12 ++ .../contracts/contracts/token/GraphToken.sol | 65 ++++-- .../contracts/contracts/token/IGraphToken.sol | 72 ++++++- .../contracts/upgrades/GraphProxy.sol | 52 +++-- .../contracts/upgrades/GraphProxyAdmin.sol | 5 +- .../contracts/upgrades/GraphProxyStorage.sol | 28 ++- .../contracts/upgrades/GraphUpgradeable.sol | 8 +- .../contracts/upgrades/IGraphProxy.sol | 58 +++++ .../contracts/contracts/utils/TokenUtils.sol | 9 +- packages/contracts/task/tasks/e2e/e2e.ts | 8 +- packages/data-edge/contracts/DataEdge.sol | 4 +- .../data-edge/contracts/EventfulDataEdge.sol | 5 + .../contracts/data-service/DataService.sol | 2 + .../data-service/DataServiceStorage.sol | 3 +- .../extensions/DataServiceFees.sol | 1 + .../extensions/DataServiceFeesStorage.sol | 2 + .../extensions/DataServicePausable.sol | 1 + .../DataServicePausableUpgradeable.sol | 3 +- .../extensions/DataServiceRescuable.sol | 7 +- .../libraries/ProvisionTracker.sol | 4 + .../utilities/ProvisionManager.sol | 5 + .../utilities/ProvisionManagerStorage.sol | 2 + .../contracts/libraries/Denominations.sol | 3 +- .../contracts/libraries/LibFixedMath.sol | 83 +++++-- .../contracts/libraries/LinkedList.sol | 6 + .../horizon/contracts/libraries/MathUtils.sol | 14 +- .../horizon/contracts/libraries/PPMMath.sol | 4 + .../horizon/contracts/libraries/UintRange.sol | 4 + .../contracts/mocks/ControllerMock.sol | 14 +- .../horizon/contracts/mocks/CurationMock.sol | 21 ++ packages/horizon/contracts/mocks/Dummy.sol | 5 + .../contracts/mocks/EpochManagerMock.sol | 50 +++++ .../horizon/contracts/mocks/MockGRTToken.sol | 60 ++++++ .../contracts/mocks/RewardsManagerMock.sol | 32 ++- .../contracts/payments/GraphPayments.sol | 4 + .../contracts/payments/PaymentsEscrow.sol | 4 + .../collectors/GraphTallyCollector.sol | 18 +- .../contracts/staking/HorizonStaking.sol | 19 +- .../contracts/staking/HorizonStakingBase.sol | 11 +- .../staking/HorizonStakingExtension.sol | 37 ++-- .../staking/HorizonStakingStorage.sol | 3 +- .../staking/libraries/ExponentialRebates.sol | 32 +-- .../contracts/staking/utilities/Managed.sol | 9 +- .../contracts/utilities/Authorizable.sol | 4 + .../contracts/utilities/GraphDirectory.sol | 1 + .../contracts/arbitrum/IArbToken.sol | 10 + .../contracts/contracts/arbitrum/IBridge.sol | 83 ++++++- .../contracts/contracts/arbitrum/IInbox.sol | 79 +++++++ .../contracts/arbitrum/IMessageProvider.sol | 14 ++ .../contracts/contracts/arbitrum/IOutbox.sol | 57 +++++ .../contracts/arbitrum/ITokenGateway.sol | 29 ++- .../contracts/contracts/base/IMulticall.sol | 1 + .../contracts/curation/ICuration.sol | 3 +- .../curation/IGraphCurationToken.sol | 19 ++ .../contracts/contracts/discovery/IGNS.sol | 23 +- .../contracts/discovery/IServiceRegistry.sol | 33 +++ .../contracts/discovery/ISubgraphNFT.sol | 42 ++++ .../discovery/ISubgraphNFTDescriptor.sol | 6 +- .../erc1056/IEthereumDIDRegistry.sol | 17 ++ .../contracts/disputes/IDisputeManager.sol | 118 +++++++++- .../contracts/epochs/IEpochManager.sol | 47 ++++ .../contracts/gateway/ICallhookReceiver.sol | 8 +- .../contracts/governance/IController.sol | 50 +++++ .../contracts/governance/IGoverned.sol | 21 +- .../contracts/governance/IManaged.sol | 3 +- .../contracts/l2/curation/IL2Curation.sol | 2 + .../contracts/l2/discovery/IL2GNS.sol | 11 + .../l2/gateway/IL2GraphTokenGateway.sol | 96 +++++++++ .../contracts/l2/staking/IL2Staking.sol | 1 + .../contracts/l2/staking/IL2StakingBase.sol | 10 + .../contracts/l2/staking/IL2StakingTypes.sol | 5 + .../contracts/l2/token/IL2GraphToken.sol | 43 ++++ .../rewards/ILegacyRewardsManager.sol | 10 + .../contracts/rewards/IRewardsIssuer.sol | 7 +- .../contracts/rewards/IRewardsManager.sol | 98 ++++++++- .../staking/IL1GraphTokenLockTransferTool.sol | 3 +- .../contracts/staking/IL1Staking.sol | 1 + .../contracts/staking/IL1StakingBase.sol | 33 ++- .../contracts/contracts/staking/IStaking.sol | 1 + .../contracts/staking/IStakingBase.sol | 87 ++++++-- .../contracts/staking/IStakingData.sol | 26 ++- .../contracts/staking/IStakingExtension.sol | 42 +++- .../contracts/staking/libs/IStakes.sol | 5 + .../contracts/contracts/token/IGraphToken.sol | 54 +++++ .../contracts/upgrades/IGraphProxy.sol | 58 +++++ .../contracts/upgrades/IGraphProxyAdmin.sol | 53 ++++- .../contracts/data-service/IDataService.sol | 4 + .../data-service/IDataServiceFees.sol | 4 + .../data-service/IDataServicePausable.sol | 4 + .../data-service/IDataServiceRescuable.sol | 4 + .../contracts/horizon/IAuthorizable.sol | 5 + .../contracts/horizon/IGraphPayments.sol | 4 + .../horizon/IGraphTallyCollector.sol | 7 +- .../contracts/horizon/IHorizonStaking.sol | 1 + .../contracts/horizon/IPaymentsCollector.sol | 1 + .../contracts/horizon/IPaymentsEscrow.sol | 1 + .../horizon/internal/IHorizonStakingBase.sol | 4 + .../internal/IHorizonStakingExtension.sol | 12 +- .../horizon/internal/IHorizonStakingMain.sol | 8 +- .../horizon/internal/IHorizonStakingTypes.sol | 5 + .../horizon/internal/ILinkedList.sol | 2 + .../subgraph-service/IDisputeManager.sol | 22 +- .../subgraph-service/ISubgraphService.sol | 4 + .../subgraph-service/internal/IAllocation.sol | 2 + .../internal/IAttestation.sol | 2 + .../internal/ILegacyAllocation.sol | 2 + .../IGraphTokenLockWallet.sol | 111 ++++++++++ .../toolshed/IControllerToolshed.sol | 2 + .../toolshed/IDisputeManagerToolshed.sol | 2 + .../toolshed/IEpochManagerToolshed.sol | 2 + .../toolshed/IGraphTallyCollectorToolshed.sol | 2 + .../IGraphTokenLockWalletToolshed.sol | 3 + .../toolshed/IHorizonStakingToolshed.sol | 2 + .../toolshed/IL2CurationToolshed.sol | 2 + .../contracts/toolshed/IL2GNSToolshed.sol | 2 + .../toolshed/IPaymentsEscrowToolshed.sol | 2 + .../toolshed/IRewardsManagerToolshed.sol | 13 +- .../toolshed/IServiceRegistryToolshed.sol | 2 + .../toolshed/ISubgraphServiceToolshed.sol | 2 + .../toolshed/internal/IAllocationManager.sol | 5 + .../contracts/toolshed/internal/IOwnable.sol | 5 + .../contracts/toolshed/internal/IPausable.sol | 2 + .../toolshed/internal/IProvisionManager.sol | 5 + .../toolshed/internal/IProvisionTracker.sol | 5 + .../contracts/DisputeManager.sol | 8 +- .../contracts/DisputeManagerStorage.sol | 6 +- .../contracts/SubgraphService.sol | 6 + .../contracts/SubgraphServiceStorage.sol | 6 +- .../contracts/libraries/Allocation.sol | 3 +- .../contracts/libraries/Attestation.sol | 16 +- .../contracts/libraries/LegacyAllocation.sol | 6 +- .../contracts/utilities/AllocationManager.sol | 12 +- .../utilities/AllocationManagerStorage.sol | 3 +- .../utilities/AttestationManager.sol | 16 +- .../utilities/AttestationManagerStorage.sol | 3 +- .../contracts/utilities/Directory.sol | 6 +- .../test/unit/mocks/MockRewardsManager.sol | 4 + .../contracts/GraphTokenDistributor.sol | 12 +- .../contracts/GraphTokenLock.sol | 29 ++- .../contracts/GraphTokenLockManager.sol | 17 +- .../contracts/GraphTokenLockSimple.sol | 9 +- .../contracts/GraphTokenLockWallet.sol | 25 ++- .../contracts/ICallhookReceiver.sol | 3 + .../contracts/IGraphTokenLock.sol | 3 +- .../contracts/IGraphTokenLockManager.sol | 7 +- .../L1GraphTokenLockTransferTool.sol | 8 + .../contracts/L2GraphTokenLockManager.sol | 6 + .../L2GraphTokenLockTransferTool.sol | 6 + .../contracts/L2GraphTokenLockWallet.sol | 3 + .../contracts/MathUtils.sol | 3 + .../contracts/MinimalProxyFactory.sol | 3 + .../token-distribution/contracts/Ownable.sol | 3 + .../contracts/arbitrum/ITokenGateway.sol | 3 + .../contracts/tests/BridgeMock.sol | 5 +- .../contracts/tests/GraphTokenMock.sol | 7 +- .../contracts/tests/InboxMock.sol | 8 +- .../contracts/tests/L1TokenGatewayMock.sol | 2 + .../contracts/tests/L2TokenGatewayMock.sol | 4 + .../contracts/tests/Stakes.sol | 5 +- .../contracts/tests/StakingMock.sol | 58 +++-- .../contracts/tests/WalletMock.sol | 8 + .../tests/arbitrum/AddressAliasHelper.sol | 6 +- .../contracts/tests/arbitrum/IBridge.sol | 3 + .../contracts/tests/arbitrum/IInbox.sol | 7 +- .../tests/arbitrum/IMessageProvider.sol | 3 + 261 files changed, 5135 insertions(+), 1575 deletions(-) delete mode 100644 packages/contracts/contracts/rewards/IRewardsManager.sol create mode 100644 packages/contracts/contracts/tests/MockERC165OnlyContract.sol diff --git a/packages/contracts/contracts/arbitrum/AddressAliasHelper.sol b/packages/contracts/contracts/arbitrum/AddressAliasHelper.sol index 740b70361..005df41c0 100644 --- a/packages/contracts/contracts/arbitrum/AddressAliasHelper.sol +++ b/packages/contracts/contracts/arbitrum/AddressAliasHelper.sol @@ -25,8 +25,15 @@ pragma solidity ^0.7.6; +/** + * @title Address Alias Helper Library + * @author Edge & Node + * @notice Utility library for converting addresses between L1 and L2 in Arbitrum + */ library AddressAliasHelper { - uint160 constant offset = uint160(0x1111000000000000000000000000000000001111); + /// @dev Offset used for L1 to L2 address aliasing + // solhint-disable-next-line const-name-snakecase + uint160 internal constant offset = uint160(0x1111000000000000000000000000000000001111); /// @notice Utility function that converts the address in the L1 that submitted a tx to /// the inbox to the msg.sender viewed in the L2 diff --git a/packages/contracts/contracts/arbitrum/IArbToken.sol b/packages/contracts/contracts/arbitrum/IArbToken.sol index d7d5a2d8c..6517f0c57 100644 --- a/packages/contracts/contracts/arbitrum/IArbToken.sol +++ b/packages/contracts/contracts/arbitrum/IArbToken.sol @@ -29,18 +29,28 @@ */ pragma solidity ^0.7.6; +/** + * @title Arbitrum Token Interface + * @author Edge & Node + * @notice Interface for tokens that can be minted and burned on Arbitrum L2 + */ interface IArbToken { /** * @notice should increase token supply by amount, and should (probably) only be callable by the L1 bridge. + * @param account Account to mint tokens to + * @param amount Amount of tokens to mint */ function bridgeMint(address account, uint256 amount) external; /** * @notice should decrease token supply by amount, and should (probably) only be callable by the L1 bridge. + * @param account Account to burn tokens from + * @param amount Amount of tokens to burn */ function bridgeBurn(address account, uint256 amount) external; /** + * @notice Get the L1 token address * @return address of layer 1 token */ function l1Address() external view returns (address); diff --git a/packages/contracts/contracts/arbitrum/IBridge.sol b/packages/contracts/contracts/arbitrum/IBridge.sol index 536ee075b..92deee878 100644 --- a/packages/contracts/contracts/arbitrum/IBridge.sol +++ b/packages/contracts/contracts/arbitrum/IBridge.sol @@ -25,7 +25,24 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + +/** + * @title Bridge Interface + * @author Edge & Node + * @notice Interface for the Arbitrum Bridge contract + */ interface IBridge { + /** + * @notice Emitted when a message is delivered to the inbox + * @param messageIndex Index of the message + * @param beforeInboxAcc Inbox accumulator before this message + * @param inbox Address of the inbox + * @param kind Type of the message + * @param sender Address that sent the message + * @param messageDataHash Hash of the message data + */ event MessageDelivered( uint256 indexed messageIndex, bytes32 indexed beforeInboxAcc, @@ -35,38 +52,102 @@ interface IBridge { bytes32 messageDataHash ); + /** + * @notice Emitted when a bridge call is triggered + * @param outbox Address of the outbox + * @param destAddr Destination address for the call + * @param amount ETH amount sent with the call + * @param data Calldata for the function call + */ event BridgeCallTriggered(address indexed outbox, address indexed destAddr, uint256 amount, bytes data); + /** + * @notice Emitted when an inbox is enabled or disabled + * @param inbox Address of the inbox + * @param enabled Whether the inbox is enabled + */ event InboxToggle(address indexed inbox, bool enabled); + /** + * @notice Emitted when an outbox is enabled or disabled + * @param outbox Address of the outbox + * @param enabled Whether the outbox is enabled + */ event OutboxToggle(address indexed outbox, bool enabled); + /** + * @notice Deliver a message to the inbox + * @param kind Type of the message + * @param sender Address that is sending the message + * @param messageDataHash keccak256 hash of the message data + * @return The message index + */ function deliverMessageToInbox( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256); + /** + * @notice Execute a call from L2 to L1 + * @param destAddr Contract to call + * @param amount ETH value to send + * @param data Calldata for the function call + * @return success True if the call was successful, false otherwise + * @return returnData Return data from the call + */ function executeCall( address destAddr, uint256 amount, bytes calldata data ) external returns (bool success, bytes memory returnData); - // These are only callable by the admin + /** + * @notice Set the address of an inbox + * @param inbox Address of the inbox + * @param enabled Whether to enable the inbox + */ function setInbox(address inbox, bool enabled) external; + /** + * @notice Set the address of an outbox + * @param inbox Address of the outbox + * @param enabled Whether to enable the outbox + */ function setOutbox(address inbox, bool enabled) external; // View functions + /** + * @notice Get the active outbox address + * @return The active outbox address + */ function activeOutbox() external view returns (address); + /** + * @notice Check if an address is an allowed inbox + * @param inbox Address to check + * @return True if the address is an allowed inbox, false otherwise + */ function allowedInboxes(address inbox) external view returns (bool); + /** + * @notice Check if an address is an allowed outbox + * @param outbox Address to check + * @return True if the address is an allowed outbox, false otherwise + */ function allowedOutboxes(address outbox) external view returns (bool); + /** + * @notice Get the inbox accumulator at a specific index + * @param index Index to query + * @return The inbox accumulator at the given index + */ function inboxAccs(uint256 index) external view returns (bytes32); + /** + * @notice Get the count of messages in the inbox + * @return Number of messages in the inbox + */ function messageCount() external view returns (uint256); } diff --git a/packages/contracts/contracts/arbitrum/IInbox.sol b/packages/contracts/contracts/arbitrum/IInbox.sol index a9315bbf8..8ded1c1bb 100644 --- a/packages/contracts/contracts/arbitrum/IInbox.sol +++ b/packages/contracts/contracts/arbitrum/IInbox.sol @@ -25,12 +25,32 @@ pragma solidity ^0.7.6; -import "./IBridge.sol"; -import "./IMessageProvider.sol"; +import { IBridge } from "./IBridge.sol"; +import { IMessageProvider } from "./IMessageProvider.sol"; +/** + * @title Inbox Interface + * @author Edge & Node + * @notice Interface for the Arbitrum Inbox contract + */ interface IInbox is IMessageProvider { + /** + * @notice Send a message to L2 + * @param messageData Encoded data to send in the message + * @return Message number returned by the inbox + */ function sendL2Message(bytes calldata messageData) external returns (uint256); + /** + * @notice Send an unsigned transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param nonce Nonce for the transaction + * @param destAddr Destination address on L2 + * @param amount Amount of ETH to send + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendUnsignedTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -40,6 +60,15 @@ interface IInbox is IMessageProvider { bytes calldata data ) external returns (uint256); + /** + * @notice Send a contract transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param destAddr Destination address on L2 + * @param amount Amount of ETH to send + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendContractTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -48,6 +77,15 @@ interface IInbox is IMessageProvider { bytes calldata data ) external returns (uint256); + /** + * @notice Send an L1-funded unsigned transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param nonce Nonce for the transaction + * @param destAddr Destination address on L2 + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendL1FundedUnsignedTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -56,6 +94,14 @@ interface IInbox is IMessageProvider { bytes calldata data ) external payable returns (uint256); + /** + * @notice Send an L1-funded contract transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param destAddr Destination address on L2 + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendL1FundedContractTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -63,6 +109,18 @@ interface IInbox is IMessageProvider { bytes calldata data ) external payable returns (uint256); + /** + * @notice Create a retryable ticket for an L2 transaction + * @param destAddr Destination address on L2 + * @param arbTxCallValue Call value for the L2 transaction + * @param maxSubmissionCost Maximum cost for submitting the ticket + * @param submissionRefundAddress Address to refund submission cost to + * @param valueRefundAddress Address to refund excess value to + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param data Transaction data + * @return Message number returned by the inbox + */ function createRetryableTicket( address destAddr, uint256 arbTxCallValue, @@ -74,15 +132,36 @@ interface IInbox is IMessageProvider { bytes calldata data ) external payable returns (uint256); + /** + * @notice Deposit ETH to L2 + * @param maxSubmissionCost Maximum cost for submitting the deposit + * @return Message number returned by the inbox + */ function depositEth(uint256 maxSubmissionCost) external payable returns (uint256); + /** + * @notice Get the bridge contract + * @return The bridge contract address + */ function bridge() external view returns (IBridge); + /** + * @notice Pause the creation of retryable tickets + */ function pauseCreateRetryables() external; + /** + * @notice Unpause the creation of retryable tickets + */ function unpauseCreateRetryables() external; + /** + * @notice Start rewriting addresses + */ function startRewriteAddress() external; + /** + * @notice Stop rewriting addresses + */ function stopRewriteAddress() external; } diff --git a/packages/contracts/contracts/arbitrum/IMessageProvider.sol b/packages/contracts/contracts/arbitrum/IMessageProvider.sol index 8fbfdb171..ce5822358 100644 --- a/packages/contracts/contracts/arbitrum/IMessageProvider.sol +++ b/packages/contracts/contracts/arbitrum/IMessageProvider.sol @@ -25,8 +25,22 @@ pragma solidity ^0.7.6; +/** + * @title Message Provider Interface + * @author Edge & Node + * @notice Interface for Arbitrum message providers + */ interface IMessageProvider { + /** + * @notice Emitted when a message is delivered to the inbox + * @param messageNum Message number + * @param data Message data + */ event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + /** + * @notice Emitted when a message is delivered from origin + * @param messageNum Message number + */ event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); } diff --git a/packages/contracts/contracts/arbitrum/IOutbox.sol b/packages/contracts/contracts/arbitrum/IOutbox.sol index 2e4f05bd5..658a6c233 100644 --- a/packages/contracts/contracts/arbitrum/IOutbox.sol +++ b/packages/contracts/contracts/arbitrum/IOutbox.sol @@ -25,13 +25,36 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + +/** + * @title Arbitrum Outbox Interface + * @author Edge & Node + * @notice Interface for the Arbitrum outbox contract + */ interface IOutbox { + /** + * @notice Emitted when an outbox entry is created + * @param batchNum Batch number + * @param outboxEntryIndex Index of the outbox entry + * @param outputRoot Output root hash + * @param numInBatch Number of messages in the batch + */ event OutboxEntryCreated( uint256 indexed batchNum, uint256 outboxEntryIndex, bytes32 outputRoot, uint256 numInBatch ); + + /** + * @notice Emitted when an outbox transaction is executed + * @param destAddr Destination address + * @param l2Sender L2 sender address + * @param outboxEntryIndex Index of the outbox entry + * @param transactionIndex Index of the transaction + */ event OutBoxTransactionExecuted( address indexed destAddr, address indexed l2Sender, @@ -39,19 +62,53 @@ interface IOutbox { uint256 transactionIndex ); + /** + * @notice Get the L2 to L1 sender address + * @return The sender address + */ function l2ToL1Sender() external view returns (address); + /** + * @notice Get the L2 to L1 block number + * @return The block number + */ function l2ToL1Block() external view returns (uint256); + /** + * @notice Get the L2 to L1 Ethereum block number + * @return The Ethereum block number + */ function l2ToL1EthBlock() external view returns (uint256); + /** + * @notice Get the L2 to L1 timestamp + * @return The timestamp + */ function l2ToL1Timestamp() external view returns (uint256); + /** + * @notice Get the L2 to L1 batch number + * @return The batch number + */ function l2ToL1BatchNum() external view returns (uint256); + /** + * @notice Get the L2 to L1 output ID + * @return The output ID + */ function l2ToL1OutputId() external view returns (bytes32); + /** + * @notice Process outgoing messages + * @param sendsData Encoded message data + * @param sendLengths Array of message lengths + */ function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths) external; + /** + * @notice Check if an outbox entry exists + * @param batchNum Batch number to check + * @return True if the entry exists + */ function outboxEntryExists(uint256 batchNum) external view returns (bool); } diff --git a/packages/contracts/contracts/arbitrum/ITokenGateway.sol b/packages/contracts/contracts/arbitrum/ITokenGateway.sol index 3b12e578e..2a0d1a2f3 100644 --- a/packages/contracts/contracts/arbitrum/ITokenGateway.sol +++ b/packages/contracts/contracts/arbitrum/ITokenGateway.sol @@ -25,6 +25,11 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Token Gateway Interface + * @author Edge & Node + * @notice Interface for token gateways that handle cross-chain token transfers + */ interface ITokenGateway { /// @notice event deprecated in favor of DepositInitiated and WithdrawalInitiated // event OutboundTransferInitiated( @@ -46,15 +51,33 @@ interface ITokenGateway { // bytes _data // ); + /** + * @notice Transfer tokens from L1 to L2 or L2 to L1 + * @param token Address of the token being transferred + * @param to Recipient address on the destination chain + * @param amount Amount of tokens to transfer + * @param maxGas Maximum gas for the transaction + * @param gasPriceBid Gas price bid for the transaction + * @param data Additional data for the transfer + * @return Transaction data + */ function outboundTransfer( address token, address to, - uint256 amunt, - uint256 maxas, - uint256 gasPiceBid, + uint256 amount, + uint256 maxGas, + uint256 gasPriceBid, bytes calldata data ) external payable returns (bytes memory); + /** + * @notice Finalize an inbound token transfer + * @param token Address of the token being transferred + * @param from Sender address on the source chain + * @param to Recipient address on the destination chain + * @param amount Amount of tokens being transferred + * @param data Additional data for the transfer + */ function finalizeInboundTransfer( address token, address from, diff --git a/packages/contracts/contracts/arbitrum/L1ArbitrumMessenger.sol b/packages/contracts/contracts/arbitrum/L1ArbitrumMessenger.sol index 839e1930b..9613294ad 100644 --- a/packages/contracts/contracts/arbitrum/L1ArbitrumMessenger.sol +++ b/packages/contracts/contracts/arbitrum/L1ArbitrumMessenger.sol @@ -25,20 +25,49 @@ pragma solidity ^0.7.6; -import "./IInbox.sol"; -import "./IOutbox.sol"; +import { IInbox } from "./IInbox.sol"; +import { IOutbox } from "./IOutbox.sol"; +import { IBridge } from "./IBridge.sol"; -/// @notice L1 utility contract to assist with L1 <=> L2 interactions -/// @dev this is an abstract contract instead of library so the functions can be easily overridden when testing +/** + * @title L1 Arbitrum Messenger + * @author Edge & Node + * @notice L1 utility contract to assist with L1 <=> L2 interactions + * @dev this is an abstract contract instead of library so the functions can be easily overridden when testing + */ abstract contract L1ArbitrumMessenger { + /** + * @notice Emitted when a transaction is sent to L2 + * @param _from Address sending the transaction + * @param _to Address receiving the transaction on L2 + * @param _seqNum Sequence number of the retryable ticket + * @param _data Transaction data + */ event TxToL2(address indexed _from, address indexed _to, uint256 indexed _seqNum, bytes _data); + /** + * @dev Parameters for L2 gas configuration + * @param _maxSubmissionCost Maximum cost for submitting the transaction + * @param _maxGas Maximum gas for the L2 transaction + * @param _gasPriceBid Gas price bid for the L2 transaction + */ struct L2GasParams { uint256 _maxSubmissionCost; uint256 _maxGas; uint256 _gasPriceBid; } + /** + * @notice Send a transaction to L2 using gas parameters struct + * @param _inbox Address of the inbox contract + * @param _to Destination address on L2 + * @param _user Address that will be credited as the sender + * @param _l1CallValue ETH value to send with the L1 transaction + * @param _l2CallValue ETH value to send with the L2 transaction + * @param _l2GasParams Gas parameters for the L2 transaction + * @param _data Calldata for the L2 transaction + * @return Sequence number of the retryable ticket + */ function sendTxToL2( address _inbox, address _to, @@ -63,6 +92,19 @@ abstract contract L1ArbitrumMessenger { ); } + /** + * @notice Send a transaction to L2 with individual gas parameters + * @param _inbox Address of the inbox contract + * @param _to Destination address on L2 + * @param _user Address that will be credited as the sender + * @param _l1CallValue ETH value to send with the L1 transaction + * @param _l2CallValue ETH value to send with the L2 transaction + * @param _maxSubmissionCost Maximum cost for submitting the transaction + * @param _maxGas Maximum gas for the L2 transaction + * @param _gasPriceBid Gas price bid for the L2 transaction + * @param _data Calldata for the L2 transaction + * @return Sequence number of the retryable ticket + */ function sendTxToL2( address _inbox, address _to, @@ -88,11 +130,21 @@ abstract contract L1ArbitrumMessenger { return seqNum; } + /** + * @notice Get the bridge contract from an inbox + * @param _inbox Address of the inbox contract + * @return Bridge contract interface + */ function getBridge(address _inbox) internal view virtual returns (IBridge) { return IInbox(_inbox).bridge(); } - /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies + /** + * @notice Get the L2 to L1 sender address from the outbox + * @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies + * @param _inbox Address of the inbox contract + * @return Address of the L2 to L1 sender + */ function getL2ToL1Sender(address _inbox) internal view virtual returns (address) { IOutbox outbox = IOutbox(getBridge(_inbox).activeOutbox()); address l2ToL1Sender = outbox.l2ToL1Sender(); diff --git a/packages/contracts/contracts/arbitrum/L2ArbitrumMessenger.sol b/packages/contracts/contracts/arbitrum/L2ArbitrumMessenger.sol index e34a29262..ac6774748 100644 --- a/packages/contracts/contracts/arbitrum/L2ArbitrumMessenger.sol +++ b/packages/contracts/contracts/arbitrum/L2ArbitrumMessenger.sol @@ -25,15 +25,35 @@ pragma solidity ^0.7.6; -import "arbos-precompiles/arbos/builtin/ArbSys.sol"; +import { ArbSys } from "arbos-precompiles/arbos/builtin/ArbSys.sol"; -/// @notice L2 utility contract to assist with L1 <=> L2 interactions -/// @dev this is an abstract contract instead of library so the functions can be easily overridden when testing +/** + * @title L2 Arbitrum Messenger + * @author Edge & Node + * @notice L2 utility contract to assist with L1 <=> L2 interactions + * @dev this is an abstract contract instead of library so the functions can be easily overridden when testing + */ abstract contract L2ArbitrumMessenger { + /// @dev Address of the ArbSys precompile address internal constant ARB_SYS_ADDRESS = address(100); + /** + * @notice Emitted when a transaction is sent to L1 + * @param _from Address sending the transaction + * @param _to Address receiving the transaction on L1 + * @param _id ID of the L2 to L1 message + * @param _data Transaction data + */ event TxToL1(address indexed _from, address indexed _to, uint256 indexed _id, bytes _data); + /** + * @notice Send a transaction from L2 to L1 + * @param _l1CallValue ETH value to send with the L1 transaction + * @param _from Address that is sending the transaction + * @param _to Destination address on L1 + * @param _data Calldata for the L1 transaction + * @return ID of the L2 to L1 message + */ function sendTxToL1( uint256 _l1CallValue, address _from, diff --git a/packages/contracts/contracts/bancor/BancorFormula.sol b/packages/contracts/contracts/bancor/BancorFormula.sol index 689eebaba..0d221be56 100644 --- a/packages/contracts/contracts/bancor/BancorFormula.sol +++ b/packages/contracts/contracts/bancor/BancorFormula.sol @@ -2,35 +2,55 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts/math/SafeMath.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines, gas-increment-by-one, gas-strict-inequalities +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; + +/** + * @title Bancor Formula Contract + * @author Edge & Node + * @notice Contract implementing Bancor's bonding curve formula for token conversion + */ contract BancorFormula { using SafeMath for uint256; - uint16 public constant version = 6; + /// @notice Version of the Bancor formula implementation + uint16 public constant version = 6; // solhint-disable-line const-name-snakecase + /// @dev Constant representing the value 1 uint256 private constant ONE = 1; + /// @dev Maximum ratio value (100% in parts per million) uint32 private constant MAX_RATIO = 1000000; + /// @dev Minimum precision for calculations uint8 private constant MIN_PRECISION = 32; + /// @dev Maximum precision for calculations uint8 private constant MAX_PRECISION = 127; /** * @dev Auto-generated via 'PrintIntScalingFactors.py' */ + /// @dev Fixed point representation of 1 (2^127) uint256 private constant FIXED_1 = 0x080000000000000000000000000000000; + /// @dev Fixed point representation of 2 (2^128) uint256 private constant FIXED_2 = 0x100000000000000000000000000000000; + /// @dev Maximum number for calculations (2^129) uint256 private constant MAX_NUM = 0x200000000000000000000000000000000; /** * @dev Auto-generated via 'PrintLn2ScalingFactors.py' */ + /// @dev Natural logarithm of 2 numerator for fixed point calculations uint256 private constant LN2_NUMERATOR = 0x3f80fe03f80fe03f80fe03f80fe03f8; + /// @dev Natural logarithm of 2 denominator for fixed point calculations uint256 private constant LN2_DENOMINATOR = 0x5b9de1d10bf4103d647b0955897ba80; /** * @dev Auto-generated via 'PrintFunctionOptimalLog.py' and 'PrintFunctionOptimalExp.py' */ + /// @dev Maximum value for optimal logarithm calculation uint256 private constant OPT_LOG_MAX_VAL = 0x15bf0a8b1457695355fb8ac404e7a79e3; + /// @dev Maximum value for optimal exponentiation calculation uint256 private constant OPT_EXP_MAX_VAL = 0x800000000000000000000000000000000; /** @@ -38,6 +58,7 @@ contract BancorFormula { */ uint256[128] private maxExpArray; + /// @notice Initialize the Bancor formula with maximum exponent array values constructor() { // maxExpArray[ 0] = 0x6bffffffffffffffffffffffffffffffff; // maxExpArray[ 1] = 0x67ffffffffffffffffffffffffffffffff; @@ -170,7 +191,7 @@ contract BancorFormula { } /** - * @dev given a token supply, reserve balance, ratio and a deposit amount (in the reserve token), + * @notice Given a token supply, reserve balance, ratio and a deposit amount (in the reserve token), * calculates the return for a given conversion (in the main token) * * Formula: @@ -210,7 +231,7 @@ contract BancorFormula { } /** - * @dev given a token supply, reserve balance, ratio and a sell amount (in the main token), + * @notice Given a token supply, reserve balance, ratio and a sell amount (in the main token), * calculates the return for a given conversion (in the reserve token) * * Formula: @@ -258,7 +279,7 @@ contract BancorFormula { } /** - * @dev given two reserve balances/ratios and a sell amount (in the first reserve token), + * @notice Given two reserve balances/ratios and a sell amount (in the first reserve token), * calculates the return for a conversion from the first reserve token to the second reserve token (in the second reserve token) * note that prior to version 4, you should use 'calculateCrossConnectorReturn' instead * @@ -304,7 +325,7 @@ contract BancorFormula { } /** - * @dev given a smart token supply, reserve balance, total ratio and an amount of requested smart tokens, + * @notice Given a smart token supply, reserve balance, total ratio and an amount of requested smart tokens, * calculates the amount of reserve tokens required for purchasing the given amount of smart tokens * * Formula: @@ -341,7 +362,7 @@ contract BancorFormula { } /** - * @dev given a smart token supply, reserve balance, total ratio and an amount of smart tokens to liquidate, + * @notice Given a smart token supply, reserve balance, total ratio and an amount of smart tokens to liquidate, * calculates the amount of reserve tokens received for selling the given amount of smart tokens * * Formula: @@ -384,7 +405,7 @@ contract BancorFormula { } /** - * @dev General Description: + * @notice General Description: * Determine a value of precision. * Calculate an integer approximation of (_baseN / _baseD) ^ (_expN / _expD) * 2 ^ precision. * Return the result along with the precision used. @@ -400,6 +421,12 @@ contract BancorFormula { * This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the intermediate computations. * This functions assumes that "_expN < 2 ^ 256 / log(MAX_NUM - 1)", otherwise the multiplication should be replaced with a "safeMul". * Since we rely on unsigned-integer arithmetic and "base < 1" ==> "log(base) < 0", this function does not support "_baseN < _baseD". + * @param _baseN Base numerator + * @param _baseD Base denominator + * @param _expN Exponent numerator + * @param _expD Exponent denominator + * @return result The computed power result + * @return precision The precision used in the calculation */ function power(uint256 _baseN, uint256 _baseD, uint32 _expN, uint32 _expD) internal view returns (uint256, uint8) { require(_baseN < MAX_NUM); @@ -422,8 +449,10 @@ contract BancorFormula { } /** - * @dev computes log(x / FIXED_1) * FIXED_1. + * @notice Computes log(x / FIXED_1) * FIXED_1. * This functions assumes that "x >= FIXED_1", because the output would be negative otherwise. + * @param x The input value (must be >= FIXED_1) + * @return The computed logarithm */ function generalLog(uint256 x) internal pure returns (uint256) { uint256 res = 0; @@ -450,7 +479,9 @@ contract BancorFormula { } /** - * @dev computes the largest integer smaller than or equal to the binary logarithm of the input. + * @notice Computes the largest integer smaller than or equal to the binary logarithm of the input. + * @param _n The input value + * @return The floor of the binary logarithm */ function floorLog2(uint256 _n) internal pure returns (uint8) { uint8 res = 0; @@ -475,9 +506,11 @@ contract BancorFormula { } /** - * @dev the global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent: + * @notice The global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent: * - This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"] * - This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"] + * @param _x The value to find position for + * @return The position in the maxExpArray */ function findPositionInMaxExpArray(uint256 _x) internal view returns (uint8) { uint8 lo = MIN_PRECISION; @@ -497,11 +530,14 @@ contract BancorFormula { } /** - * @dev this function can be auto-generated by the script 'PrintFunctionGeneralExp.py'. + * @notice This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'. * it approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!". * it returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy. * the global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1". * the maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (MAX_PRECISION - precision)". + * @param _x The exponent value + * @param _precision The precision to use + * @return The computed exponential result */ function generalExp(uint256 _x, uint8 _precision) internal pure returns (uint256) { uint256 xi = _x; @@ -576,7 +612,7 @@ contract BancorFormula { } /** - * @dev computes log(x / FIXED_1) * FIXED_1 + * @notice Computes log(x / FIXED_1) * FIXED_1 * Input range: FIXED_1 <= x <= LOG_EXP_MAX_VAL - 1 * Auto-generated via 'PrintFunctionOptimalLog.py' * Detailed description: @@ -585,6 +621,8 @@ contract BancorFormula { * - The natural logarithm of r is calculated via Taylor series for log(1 + x), where x = r - 1 * - The natural logarithm of the input is calculated by summing up the intermediate results above * - For example: log(250) = log(e^4 * e^1 * e^0.5 * 1.021692859) = 4 + 1 + 0.5 + log(1 + 0.021692859) + * @param x The input value + * @return The computed logarithm */ function optimalLog(uint256 x) internal pure returns (uint256) { uint256 res = 0; @@ -648,7 +686,7 @@ contract BancorFormula { } /** - * @dev computes e ^ (x / FIXED_1) * FIXED_1 + * @notice Computes e ^ (x / FIXED_1) * FIXED_1 * input range: 0 <= x <= OPT_EXP_MAX_VAL - 1 * auto-generated via 'PrintFunctionOptimalExp.py' * Detailed description: @@ -657,6 +695,8 @@ contract BancorFormula { * - The exponentiation of r is calculated via Taylor series for e^x, where x = r * - The exponentiation of the input is calculated by multiplying the intermediate results above * - For example: e^5.521692859 = e^(4 + 1 + 0.5 + 0.021692859) = e^4 * e^1 * e^0.5 * e^0.021692859 + * @param x The input value + * @return The computed exponential result */ function optimalExp(uint256 x) internal pure returns (uint256) { uint256 res = 0; @@ -724,7 +764,13 @@ contract BancorFormula { } /** - * @dev deprecated, backward compatibility + * @notice Deprecated function for backward compatibility + * @param _fromConnectorBalance input connector balance + * @param _fromConnectorWeight input connector weight + * @param _toConnectorBalance output connector balance + * @param _toConnectorWeight output connector weight + * @param _amount input connector amount + * @return output connector amount */ function calculateCrossConnectorReturn( uint256 _fromConnectorBalance, diff --git a/packages/contracts/contracts/base/IMulticall.sol b/packages/contracts/contracts/base/IMulticall.sol index 10f7fa469..07f40ea36 100644 --- a/packages/contracts/contracts/base/IMulticall.sol +++ b/packages/contracts/contracts/base/IMulticall.sol @@ -5,6 +5,7 @@ pragma abicoder v2; /** * @title Multicall interface + * @author Edge & Node * @notice Enables calling multiple methods in a single call to the contract */ interface IMulticall { diff --git a/packages/contracts/contracts/base/Multicall.sol b/packages/contracts/contracts/base/Multicall.sol index 49111840d..9d9d48d34 100644 --- a/packages/contracts/contracts/base/Multicall.sol +++ b/packages/contracts/contracts/base/Multicall.sol @@ -3,13 +3,17 @@ pragma solidity ^0.7.6; pragma abicoder v2; -import "./IMulticall.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one + +import { IMulticall } from "./IMulticall.sol"; // Inspired by https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/base/Multicall.sol // Note: Removed payable from the multicall /** * @title Multicall + * @author Edge & Node * @notice Enables calling multiple methods in a single call to the contract */ abstract contract Multicall is IMulticall { @@ -17,11 +21,12 @@ abstract contract Multicall is IMulticall { function multicall(bytes[] calldata data) external override returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { - (bool success, bytes memory result) = address(this).delegatecall(data[i]); + (bool success, bytes memory result) = address(this).delegatecall(data[i]); // solhint-disable-line avoid-low-level-calls if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); + // solhint-disable-next-line no-inline-assembly assembly { result := add(result, 0x04) } diff --git a/packages/contracts/contracts/curation/Curation.sol b/packages/contracts/contracts/curation/Curation.sol index 827c230b7..acbbc5df9 100644 --- a/packages/contracts/contracts/curation/Curation.sol +++ b/packages/contracts/contracts/curation/Curation.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-small-strings, gas-strict-inequalities + import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import { SafeMathUpgradeable } from "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import { ClonesUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/ClonesUpgradeable.sol"; @@ -10,7 +13,7 @@ import { ClonesUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/Clo import { BancorFormula } from "../bancor/BancorFormula.sol"; import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; import { TokenUtils } from "../utils/TokenUtils.sol"; -import { IRewardsManager } from "../rewards/IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; import { Managed } from "../governance/Managed.sol"; import { IGraphToken } from "../token/IGraphToken.sol"; import { CurationV2Storage } from "./CurationStorage.sol"; @@ -18,7 +21,8 @@ import { IGraphCurationToken } from "./IGraphCurationToken.sol"; /** * @title Curation contract - * @dev Allows curators to signal on subgraph deployments that might be relevant to indexers by + * @author Edge & Node + * @notice Allows curators to signal on subgraph deployments that might be relevant to indexers by * staking Graph Tokens (GRT). Additionally, curators earn fees from the Query Market related to the * subgraph deployment they curate. * A curators deposit goes to a curation pool along with the deposits of other curators, @@ -40,9 +44,14 @@ contract Curation is CurationV2Storage, GraphUpgradeable { // -- Events -- /** - * @dev Emitted when `curator` deposited `tokens` on `subgraphDeploymentID` as curation signal. + * @notice Emitted when `curator` deposited `tokens` on `subgraphDeploymentID` as curation signal. * The `curator` receives `signal` amount according to the curation pool bonding curve. * An amount of `curationTax` will be collected and burned. + * @param curator Address of the curator + * @param subgraphDeploymentID Subgraph deployment being signaled on + * @param tokens Amount of tokens deposited + * @param signal Amount of signal minted + * @param curationTax Amount of tokens burned as curation tax */ event Signalled( address indexed curator, @@ -53,14 +62,20 @@ contract Curation is CurationV2Storage, GraphUpgradeable { ); /** - * @dev Emitted when `curator` burned `signal` for a `subgraphDeploymentID`. + * @notice Emitted when `curator` burned `signal` for a `subgraphDeploymentID`. * The curator will receive `tokens` according to the value of the bonding curve. + * @param curator Address of the curator + * @param subgraphDeploymentID Subgraph deployment being signaled on + * @param tokens Amount of tokens received + * @param signal Amount of signal burned */ event Burned(address indexed curator, bytes32 indexed subgraphDeploymentID, uint256 tokens, uint256 signal); /** - * @dev Emitted when `tokens` amount were collected for `subgraphDeploymentID` as part of fees + * @notice Emitted when `tokens` amount were collected for `subgraphDeploymentID` as part of fees * distributed by an indexer from query fees received from state channels. + * @param subgraphDeploymentID Subgraph deployment that collected fees + * @param tokens Amount of tokens collected as fees */ event Collected(bytes32 indexed subgraphDeploymentID, uint256 tokens); @@ -94,8 +109,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Set the default reserve ratio percentage for a curation pool. - * @notice Update the default reserve ratio to `_defaultReserveRatio` + * @notice Set the default reserve ratio percentage for a curation pool. * @param _defaultReserveRatio Reserve ratio (in PPM) */ function setDefaultReserveRatio(uint32 _defaultReserveRatio) external override onlyGovernor { @@ -103,8 +117,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Set the minimum deposit amount for curators. - * @notice Update the minimum deposit amount to `_minimumCurationDeposit` + * @notice Set the minimum deposit amount for curators. * @param _minimumCurationDeposit Minimum amount of tokens required deposit */ function setMinimumCurationDeposit(uint256 _minimumCurationDeposit) external override onlyGovernor { @@ -207,7 +220,6 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Return an amount of signal to get tokens back. * @notice Burn _signal from the SubgraphDeployment curation pool * @param _subgraphDeploymentID SubgraphDeployment the curator is returning signal * @param _signalIn Amount of signal to return @@ -313,7 +325,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Calculate amount of signal that can be bought with tokens in a curation pool. + * @notice Calculate amount of signal that can be bought with tokens in a curation pool. * @param _subgraphDeploymentID Subgraph deployment to mint signal * @param _tokensIn Amount of tokens used to mint signal * @return Amount of signal that can be bought with tokens @@ -367,7 +379,6 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Internal: Set the default reserve ratio percentage for a curation pool. * @notice Update the default reserver ratio to `_defaultReserveRatio` * @param _defaultReserveRatio Reserve ratio (in PPM) */ @@ -381,7 +392,6 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Internal: Set the minimum deposit amount for curators. * @notice Update the minimum deposit amount to `_minimumCurationDeposit` * @param _minimumCurationDeposit Minimum amount of tokens required deposit */ @@ -393,7 +403,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Internal: Set the curation tax percentage (in PPM) to charge when a curator deposits GRT tokens. + * @notice Internal: Set the curation tax percentage (in PPM) to charge when a curator deposits GRT tokens. * @param _percentage Curation tax charged when depositing GRT tokens in PPM */ function _setCurationTaxPercentage(uint32 _percentage) private { @@ -404,7 +414,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Internal: Set the master copy to use as clones for the curation token. + * @notice Internal: Set the master copy to use as clones for the curation token. * @param _curationTokenMaster Address of implementation contract to use for curation tokens */ function _setCurationTokenMaster(address _curationTokenMaster) private { @@ -416,7 +426,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { } /** - * @dev Triggers an update of rewards due to a change in signal. + * @notice Triggers an update of rewards due to a change in signal. * @param _subgraphDeploymentID Subgraph deployment updated */ function _updateRewards(bytes32 _subgraphDeploymentID) private { diff --git a/packages/contracts/contracts/curation/CurationStorage.sol b/packages/contracts/contracts/curation/CurationStorage.sol index 12f5b255b..92e0f7843 100644 --- a/packages/contracts/contracts/curation/CurationStorage.sol +++ b/packages/contracts/contracts/curation/CurationStorage.sol @@ -1,7 +1,11 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// solhint-disable one-contract-per-file pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; import { ICuration } from "./ICuration.sol"; @@ -10,7 +14,8 @@ import { Managed } from "../governance/Managed.sol"; /** * @title Curation Storage version 1 - * @dev This contract holds the first version of the storage variables + * @author Edge & Node + * @notice This contract holds the first version of the storage variables * for the Curation and L2Curation contracts. * When adding new variables, create a new version that inherits this and update * the contracts to use the new version instead. @@ -21,6 +26,9 @@ abstract contract CurationV1Storage is Managed, ICuration { /** * @dev CurationPool structure that holds the pool's state * for a particular subgraph deployment. + * @param tokens GRT Tokens stored as reserves for the subgraph deployment + * @param reserveRatio Ratio for the bonding curve, unused and deprecated in L2 where it will always be 100% but appear as 0 + * @param gcs Curation token contract for this curation pool */ struct CurationPool { uint256 tokens; // GRT Tokens stored as reserves for the subgraph deployment @@ -30,35 +38,36 @@ abstract contract CurationV1Storage is Managed, ICuration { // -- State -- - /// Tax charged when curators deposit funds. + /// @notice Tax charged when curators deposit funds. /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) uint32 public override curationTaxPercentage; - /// Default reserve ratio to configure curator shares bonding curve + /// @notice Default reserve ratio to configure curator shares bonding curve /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%). /// Unused in L2. uint32 public defaultReserveRatio; - /// Master copy address that holds implementation of curation token. + /// @notice Master copy address that holds implementation of curation token. /// @dev This is used as the target for GraphCurationToken clones. address public curationTokenMaster; - /// Minimum amount allowed to be deposited by curators to initialize a pool + /// @notice Minimum amount allowed to be deposited by curators to initialize a pool /// @dev This is the `startPoolBalance` for the bonding curve uint256 public minimumCurationDeposit; - /// Bonding curve library + /// @notice Bonding curve library /// Unused in L2. address public bondingCurve; - /// @dev Mapping of subgraphDeploymentID => CurationPool + /// @notice Mapping of subgraphDeploymentID => CurationPool /// There is only one CurationPool per SubgraphDeploymentID mapping(bytes32 => CurationPool) public pools; } /** * @title Curation Storage version 2 - * @dev This contract holds the second version of the storage variables + * @author Edge & Node + * @notice This contract holds the second version of the storage variables * for the Curation and L2Curation contracts. * It doesn't add new variables at this contract's level, but adds the Initializable * contract to the inheritance chain, which includes storage variables. @@ -71,6 +80,8 @@ abstract contract CurationV2Storage is CurationV1Storage, Initializable { /** * @title Curation Storage version 3 + * @author Edge & Node + * @notice This contract holds the third version of the storage variables for the Curation and L2Curation contracts * @dev This contract holds the third version of the storage variables * for the Curation and L2Curation contracts. * It adds a new variable subgraphService to the storage. @@ -78,6 +89,6 @@ abstract contract CurationV2Storage is CurationV1Storage, Initializable { * the contracts to use the new version instead. */ abstract contract CurationV3Storage is CurationV2Storage { - // Address of the subgraph service + /// @notice Address of the subgraph service address public subgraphService; } diff --git a/packages/contracts/contracts/curation/GraphCurationToken.sol b/packages/contracts/contracts/curation/GraphCurationToken.sol index 78b721e1b..108cc0680 100644 --- a/packages/contracts/contracts/curation/GraphCurationToken.sol +++ b/packages/contracts/contracts/curation/GraphCurationToken.sol @@ -2,13 +2,14 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import { ERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import "../governance/Governed.sol"; +import { Governed } from "../governance/Governed.sol"; /** * @title GraphCurationToken contract - * @dev This is the implementation of the Curation ERC20 token (GCS). + * @author Edge & Node + * @notice This is the implementation of the Curation ERC20 token (GCS). * * GCS are created for each subgraph deployment curated in the Curation contract. * The Curation contract is the owner of GCS tokens and the only one allowed to mint or @@ -20,7 +21,7 @@ import "../governance/Governed.sol"; */ contract GraphCurationToken is ERC20Upgradeable, Governed { /** - * @dev Graph Curation Token Contract initializer. + * @notice Graph Curation Token Contract initializer. * @param _owner Address of the contract issuing this token */ function initialize(address _owner) external initializer { @@ -29,7 +30,7 @@ contract GraphCurationToken is ERC20Upgradeable, Governed { } /** - * @dev Mint new tokens. + * @notice Mint new tokens. * @param _to Address to send the newly minted tokens * @param _amount Amount of tokens to mint */ @@ -38,7 +39,7 @@ contract GraphCurationToken is ERC20Upgradeable, Governed { } /** - * @dev Burn tokens from an address. + * @notice Burn tokens from an address. * @param _account Address from where tokens will be burned * @param _amount Amount of tokens to burn */ diff --git a/packages/contracts/contracts/curation/ICuration.sol b/packages/contracts/contracts/curation/ICuration.sol index 4f2c2bac5..b71273c25 100644 --- a/packages/contracts/contracts/curation/ICuration.sol +++ b/packages/contracts/contracts/curation/ICuration.sol @@ -4,7 +4,8 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Curation Interface - * @dev Interface for the Curation contract (and L2Curation too) + * @author Edge & Node + * @notice Interface for the Curation contract (and L2Curation too) */ interface ICuration { // -- Configuration -- diff --git a/packages/contracts/contracts/curation/IGraphCurationToken.sol b/packages/contracts/contracts/curation/IGraphCurationToken.sol index 43679aba6..10dda6dcf 100644 --- a/packages/contracts/contracts/curation/IGraphCurationToken.sol +++ b/packages/contracts/contracts/curation/IGraphCurationToken.sol @@ -2,12 +2,31 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import { IERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +/** + * @title Graph Curation Token Interface + * @author Edge & Node + * @notice Interface for curation tokens that represent shares in subgraph curation pools + */ interface IGraphCurationToken is IERC20Upgradeable { + /** + * @notice Graph Curation Token Contract initializer. + * @param _owner Address of the contract issuing this token + */ function initialize(address _owner) external; + /** + * @notice Burn tokens from an address. + * @param _account Address from where tokens will be burned + * @param _amount Amount of tokens to burn + */ function burnFrom(address _account, uint256 _amount) external; + /** + * @notice Mint new tokens. + * @param _to Address to send the newly minted tokens + * @param _amount Amount of tokens to mint + */ function mint(address _to, uint256 _amount) external; } diff --git a/packages/contracts/contracts/discovery/GNS.sol b/packages/contracts/contracts/discovery/GNS.sol index 3cbb9ca8a..27310242c 100644 --- a/packages/contracts/contracts/discovery/GNS.sol +++ b/packages/contracts/contracts/discovery/GNS.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines, gas-indexed-events, gas-small-strings, gas-strict-inequalities + import { SafeMathUpgradeable } from "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; @@ -18,7 +21,8 @@ import { GNSV3Storage } from "./GNSStorage.sol"; /** * @title GNS - * @dev The Graph Name System contract provides a decentralized naming system for subgraphs + * @author Edge & Node + * @notice The Graph Name System contract provides a decentralized naming system for subgraphs * used in the scope of the Graph Network. It translates Subgraphs into Subgraph Versions. * Each version is associated with a Subgraph Deployment. The contract has no knowledge of * human-readable names. All human readable names emitted in events. @@ -34,15 +38,21 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { uint32 private constant MAX_PPM = 1000000; /// @dev Equates to Connector weight on bancor formula to be CW = 1 + // solhint-disable-next-line immutable-vars-naming uint32 internal immutable fixedReserveRatio = MAX_PPM; // -- Events -- - /// @dev Emitted when the subgraph NFT contract is updated + /// @notice Emitted when the subgraph NFT contract is updated + /// @param subgraphNFT Address of the new subgraph NFT contract event SubgraphNFTUpdated(address subgraphNFT); /** - * @dev Emitted when graph account sets its default name + * @notice Emitted when graph account sets its default name + * @param graphAccount Address of the graph account + * @param nameSystem Name system identifier (only ENS for now) + * @param nameIdentifier Name identifier in the name system + * @param name Human-readable name */ event SetDefaultName( address indexed graphAccount, @@ -52,12 +62,17 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { ); /** - * @dev Emitted when the subgraph metadata is updated. + * @notice Emitted when the subgraph metadata is updated. + * @param subgraphID ID of the subgraph + * @param subgraphMetadata IPFS hash of the subgraph metadata */ event SubgraphMetadataUpdated(uint256 indexed subgraphID, bytes32 subgraphMetadata); /** - * @dev Emitted when a subgraph version is updated. + * @notice Emitted when a subgraph version is updated. + * @param subgraphID ID of the subgraph + * @param subgraphDeploymentID Subgraph deployment ID for the new version + * @param versionMetadata IPFS hash of the version metadata */ event SubgraphVersionUpdated( uint256 indexed subgraphID, @@ -66,7 +81,12 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { ); /** - * @dev Emitted when a curator mints signal. + * @notice Emitted when a curator mints signal. + * @param subgraphID ID of the subgraph + * @param curator Address of the curator + * @param nSignalCreated Amount of name signal created + * @param vSignalCreated Amount of version signal created + * @param tokensDeposited Amount of tokens deposited */ event SignalMinted( uint256 indexed subgraphID, @@ -77,7 +97,12 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { ); /** - * @dev Emitted when a curator burns signal. + * @notice Emitted when a curator burns signal. + * @param subgraphID ID of the subgraph + * @param curator Address of the curator + * @param nSignalBurnt Amount of name signal burned + * @param vSignalBurnt Amount of version signal burned + * @param tokensReceived Amount of tokens received */ event SignalBurned( uint256 indexed subgraphID, @@ -88,7 +113,11 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { ); /** - * @dev Emitted when a curator transfers signal. + * @notice Emitted when a curator transfers signal. + * @param subgraphID ID of the subgraph + * @param from Address transferring the signal + * @param to Address receiving the signal + * @param nSignalTransferred Amount of name signal transferred */ event SignalTransferred( uint256 indexed subgraphID, @@ -98,14 +127,21 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { ); /** - * @dev Emitted when a subgraph is created. + * @notice Emitted when a subgraph is created. + * @param subgraphID ID of the subgraph + * @param subgraphDeploymentID Subgraph deployment ID + * @param reserveRatio Reserve ratio for the bonding curve */ event SubgraphPublished(uint256 indexed subgraphID, bytes32 indexed subgraphDeploymentID, uint32 reserveRatio); /** - * @dev Emitted when a subgraph is upgraded to point to a new + * @notice Emitted when a subgraph is upgraded to point to a new * subgraph deployment, burning all the old vSignal and depositing the GRT into the * new vSignal curve. + * @param subgraphID ID of the subgraph + * @param vSignalCreated Amount of version signal created in the new deployment + * @param tokensSignalled Amount of tokens signalled in the new deployment + * @param subgraphDeploymentID New subgraph deployment ID */ event SubgraphUpgraded( uint256 indexed subgraphID, @@ -115,29 +151,39 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { ); /** - * @dev Emitted when a subgraph is deprecated. + * @notice Emitted when a subgraph is deprecated. + * @param subgraphID ID of the subgraph + * @param withdrawableGRT Amount of GRT available for withdrawal */ event SubgraphDeprecated(uint256 indexed subgraphID, uint256 withdrawableGRT); /** - * @dev Emitted when a curator withdraws GRT from a deprecated subgraph + * @notice Emitted when a curator withdraws GRT from a deprecated subgraph + * @param subgraphID ID of the subgraph + * @param curator Address of the curator + * @param nSignalBurnt Amount of name signal burned + * @param withdrawnGRT Amount of GRT withdrawn */ event GRTWithdrawn(uint256 indexed subgraphID, address indexed curator, uint256 nSignalBurnt, uint256 withdrawnGRT); /** - * @dev Emitted when the counterpart (L1/L2) GNS address is updated + * @notice Emitted when the counterpart (L1/L2) GNS address is updated + * @param _counterpart Address of the counterpart GNS contract */ event CounterpartGNSAddressUpdated(address _counterpart); // -- Modifiers -- /** - * @dev Emitted when a legacy subgraph is claimed + * @notice Emitted when a legacy subgraph is claimed + * @param graphAccount Address of the graph account that created the subgraph + * @param subgraphNumber Sequence number of the subgraph */ event LegacySubgraphClaimed(address indexed graphAccount, uint256 subgraphNumber); /** - * @dev Modifier that allows only a subgraph operator to be the caller + * @notice Modifier that allows only a subgraph operator to be the caller + * @param _subgraphID ID of the subgraph to check authorization for */ modifier onlySubgraphAuth(uint256 _subgraphID) { require(ownerOf(_subgraphID) == msg.sender, "GNS: Must be authorized"); @@ -160,7 +206,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Approve curation contract to pull funds. + * @inheritdoc IGNS */ function approveAll() external override { graphToken().approve(address(curation()), type(uint256).max); @@ -169,9 +215,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { // -- Config -- /** - * @notice Set the owner fee percentage. This is used to prevent a subgraph owner to drain all - * the name curators tokens while upgrading or deprecating and is configurable in parts per million. - * @param _ownerTaxPercentage Owner tax percentage + * @inheritdoc IGNS */ function setOwnerTaxPercentage(uint32 _ownerTaxPercentage) external override onlyGovernor { _setOwnerTaxPercentage(_ownerTaxPercentage); @@ -200,11 +244,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { // -- Actions -- /** - * @notice Allows a graph account to set a default name - * @param _graphAccount Account that is setting its name - * @param _nameSystem Name system account already has ownership of a name in - * @param _nameIdentifier The unique identifier that is used to identify the name in the system - * @param _name The name being set as default + * @inheritdoc IGNS */ function setDefaultName( address _graphAccount, @@ -217,9 +257,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Allows a subgraph owner to update the metadata of a subgraph they have published - * @param _subgraphID Subgraph ID - * @param _subgraphMetadata IPFS hash for the subgraph metadata + * @inheritdoc IGNS */ function updateSubgraphMetadata( uint256 _subgraphID, @@ -229,10 +267,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Publish a new subgraph. - * @param _subgraphDeploymentID Subgraph deployment for the subgraph - * @param _versionMetadata IPFS hash for the subgraph version metadata - * @param _subgraphMetadata IPFS hash for the subgraph metadata + * @inheritdoc IGNS */ function publishNewSubgraph( bytes32 _subgraphDeploymentID, @@ -261,10 +296,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Publish a new version of an existing subgraph. - * @param _subgraphID Subgraph ID - * @param _subgraphDeploymentID Subgraph deployment ID of the new version - * @param _versionMetadata IPFS hash for the subgraph version metadata + * @inheritdoc IGNS */ function publishNewVersion( uint256 _subgraphID, @@ -322,10 +354,10 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Deprecate a subgraph. The bonding curve is destroyed, the vSignal is burned, and the GNS + * @inheritdoc IGNS + * @notice The bonding curve is destroyed, the vSignal is burned, and the GNS * contract holds the GRT from burning the vSignal, which all curators can withdraw manually. * Can only be done by the subgraph owner. - * @param _subgraphID Subgraph ID */ function deprecateSubgraph(uint256 _subgraphID) external override notPaused onlySubgraphAuth(_subgraphID) { // Subgraph check @@ -350,10 +382,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Deposit GRT into a subgraph and mint signal. - * @param _subgraphID Subgraph ID - * @param _tokensIn The amount of tokens the nameCurator wants to deposit - * @param _nSignalOutMin Expected minimum amount of name signal to receive + * @inheritdoc IGNS */ function mintSignal( uint256 _subgraphID, @@ -383,10 +412,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Burn signal for a subgraph and return the GRT. - * @param _subgraphID Subgraph ID - * @param _nSignal The amount of nSignal the nameCurator wants to burn - * @param _tokensOutMin Expected minimum amount of tokens to receive + * @inheritdoc IGNS */ function burnSignal( uint256 _subgraphID, @@ -543,7 +569,9 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { * @notice Calculate subgraph signal to be returned for an amount of tokens. * @param _subgraphID Subgraph ID * @param _tokensIn Tokens being exchanged for subgraph signal - * @return Amount of subgraph signal and curation tax + * @return nSignalOut Amount of name signal minted + * @return curationTax Amount of curation tax charged + * @return vSignalOut Amount of version signal minted */ function tokensToNSignal( uint256 _subgraphID, @@ -562,7 +590,8 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { * @notice Calculate tokens returned for an amount of subgraph signal. * @param _subgraphID Subgraph ID * @param _nSignalIn Subgraph signal being exchanged for tokens - * @return Amount of tokens returned for an amount of subgraph signal + * @return vSignalOut Amount of version signal burned + * @return tokensOut Amount of tokens returned */ function nSignalToTokens(uint256 _subgraphID, uint256 _nSignalIn) public view override returns (uint256, uint256) { // Get subgraph or revert if not published @@ -574,10 +603,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Calculate subgraph signal to be returned for an amount of subgraph deployment signal. - * @param _subgraphID Subgraph ID - * @param _vSignalIn Amount of subgraph deployment signal to exchange for subgraph signal - * @return Amount of subgraph signal that can be bought + * @inheritdoc IGNS */ function vSignalToNSignal(uint256 _subgraphID, uint256 _vSignalIn) public view override returns (uint256) { SubgraphData storage subgraphData = _getSubgraphData(_subgraphID); @@ -591,10 +617,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Calculate subgraph deployment signal to be returned for an amount of subgraph signal. - * @param _subgraphID Subgraph ID - * @param _nSignalIn Subgraph signal being exchanged for subgraph deployment signal - * @return Amount of subgraph deployment signal that can be returned + * @inheritdoc IGNS */ function nSignalToVSignal(uint256 _subgraphID, uint256 _nSignalIn) public view override returns (uint256) { SubgraphData storage subgraphData = _getSubgraphData(_subgraphID); @@ -602,29 +625,21 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Get the amount of subgraph signal a curator has. - * @param _subgraphID Subgraph ID - * @param _curator Curator address - * @return Amount of subgraph signal owned by a curator + * @inheritdoc IGNS */ function getCuratorSignal(uint256 _subgraphID, address _curator) public view override returns (uint256) { return _getSubgraphData(_subgraphID).curatorNSignal[_curator]; } /** - * @notice Return whether a subgraph is published. - * @param _subgraphID Subgraph ID - * @return Return true if subgraph is currently published + * @inheritdoc IGNS */ function isPublished(uint256 _subgraphID) public view override returns (bool) { return _isPublished(_getSubgraphData(_subgraphID)); } /** - * @notice Returns account and sequence ID for a legacy subgraph (created before subgraph NFTs). - * @param _subgraphID Subgraph ID - * @return account Account that created the subgraph (or 0 if it's not a legacy subgraph) - * @return seqID Sequence number for the subgraph + * @inheritdoc IGNS */ function getLegacySubgraphKey(uint256 _subgraphID) public view override returns (address account, uint256 seqID) { LegacySubgraphKey storage legacySubgraphKey = legacySubgraphKeys[_subgraphID]; @@ -633,16 +648,14 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @notice Return the owner of a subgraph. - * @param _tokenID Subgraph ID - * @return Owner address + * @inheritdoc IGNS */ function ownerOf(uint256 _tokenID) public view override returns (address) { return subgraphNFT.ownerOf(_tokenID); } /** - * @dev Calculate tax that owner will have to cover for upgrading or deprecating. + * @notice Calculate tax that owner will have to cover for upgrading or deprecating. * @param _tokens Tokens that were received from deprecating the old subgraph * @param _owner Subgraph owner * @param _curationTaxPercentage Tax percentage on curation deposits from Curation contract @@ -689,8 +702,9 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Return the next subgraphID given the account that is creating the subgraph. + * @notice Return the next subgraphID given the account that is creating the subgraph. * NOTE: This function updates the sequence ID for the account + * @param _account The account creating the subgraph * @return Sequence ID for the account */ function _nextSubgraphID(address _account) internal returns (uint256) { @@ -698,8 +712,9 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Return a new consecutive sequence ID for an account and update to the next value. + * @notice Return a new consecutive sequence ID for an account and update to the next value. * NOTE: This function updates the sequence ID for the account + * @param _account The account to get the next sequence ID for * @return Sequence ID for the account */ function _nextAccountSeqID(address _account) internal returns (uint256) { @@ -709,7 +724,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Mint the NFT for the subgraph. + * @notice Mint the NFT for the subgraph. * @param _owner Owner address * @param _tokenID Subgraph ID */ @@ -718,7 +733,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Burn the NFT for the subgraph. + * @notice Burn the NFT for the subgraph. * @param _tokenID Subgraph ID */ function _burnNFT(uint256 _tokenID) internal { @@ -726,7 +741,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Set the subgraph metadata. + * @notice Set the subgraph metadata. * @param _tokenID Subgraph ID * @param _subgraphMetadata IPFS hash of the subgraph metadata */ @@ -739,7 +754,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Get subgraph data. + * @notice Get subgraph data. * This function will first look for a v1 subgraph and return it if found. * @param _subgraphID Subgraph ID * @return Subgraph Data @@ -755,7 +770,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Return whether a subgraph is published. + * @notice Return whether a subgraph is published. * @param _subgraphData Subgraph Data * @return Return true if subgraph is currently published */ @@ -764,7 +779,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Return the subgraph data or revert if not published or deprecated. + * @notice Return the subgraph data or revert if not published or deprecated. * @param _subgraphID Subgraph ID * @return Subgraph Data */ @@ -775,9 +790,11 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Build a subgraph ID based on the account creating it and a sequence number for that account. + * @notice Build a subgraph ID based on the account creating it and a sequence number for that account. * Only used for legacy subgraphs being migrated, as new ones will also use the chainid. * Subgraph ID is the keccak hash of account+seqID + * @param _account The account creating the subgraph + * @param _seqID The sequence ID for the account * @return Subgraph ID */ function _buildLegacySubgraphID(address _account, uint256 _seqID) internal pure returns (uint256) { @@ -785,8 +802,10 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Build a subgraph ID based on the account creating it and a sequence number for that account. + * @notice Build a subgraph ID based on the account creating it and a sequence number for that account. * Subgraph ID is the keccak hash of account+seqID + * @param _account The account creating the subgraph + * @param _seqID The sequence ID for the account * @return Subgraph ID */ function _buildSubgraphID(address _account, uint256 _seqID) internal pure returns (uint256) { @@ -800,7 +819,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Internal: Set the owner tax percentage. This is used to prevent a subgraph owner to drain all + * @notice Internal: Set the owner tax percentage. This is used to prevent a subgraph owner to drain all * the name curators tokens while upgrading or deprecating and is configurable in parts per million. * @param _ownerTaxPercentage Owner tax percentage */ @@ -811,7 +830,7 @@ abstract contract GNS is GNSV3Storage, GraphUpgradeable, IGNS, Multicall { } /** - * @dev Internal: Set the NFT registry contract + * @notice Internal: Set the NFT registry contract * @param _subgraphNFT Address of the ERC721 contract */ function _setSubgraphNFT(address _subgraphNFT) private { diff --git a/packages/contracts/contracts/discovery/GNSStorage.sol b/packages/contracts/contracts/discovery/GNSStorage.sol index 80122c9ba..696546cab 100644 --- a/packages/contracts/contracts/discovery/GNSStorage.sol +++ b/packages/contracts/contracts/discovery/GNSStorage.sol @@ -1,8 +1,12 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// solhint-disable one-contract-per-file pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; import { Managed } from "../governance/Managed.sol"; @@ -12,12 +16,13 @@ import { ISubgraphNFT } from "./ISubgraphNFT.sol"; /** * @title GNSV1Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the GNS contract, version 1 */ abstract contract GNSV1Storage is Managed { // -- State -- - /// Percentage of curation tax that must be paid by the owner, in parts per million. + /// @notice Percentage of curation tax that must be paid by the owner, in parts per million. uint32 public ownerTaxPercentage; /// @dev [DEPRECATED] Bonding curve formula. @@ -29,11 +34,11 @@ abstract contract GNSV1Storage is Managed { /// (graphAccountID, subgraphNumber) => subgraphDeploymentID mapping(address => mapping(uint256 => bytes32)) internal legacySubgraphs; - /// Every time an account creates a subgraph it increases a per-account sequence ID. + /// @notice Every time an account creates a subgraph it increases a per-account sequence ID. /// account => seqID mapping(address => uint256) public nextAccountSeqID; - /// Stores all the signal deposited on a legacy subgraph. + /// @notice Stores all the signal deposited on a legacy subgraph. /// (graphAccountID, subgraphNumber) => SubgraphData mapping(address => mapping(uint256 => IGNS.SubgraphData)) public legacySubgraphData; @@ -44,31 +49,33 @@ abstract contract GNSV1Storage is Managed { /** * @title GNSV2Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the GNS contract, version 2 */ abstract contract GNSV2Storage is GNSV1Storage { - /// Stores the account and seqID for a legacy subgraph that has been migrated. + /// @notice Stores the account and seqID for a legacy subgraph that has been migrated. /// Use it whenever a legacy (v1) subgraph NFT was claimed to maintain compatibility. /// Keep a reference from subgraphID => (graphAccount, subgraphNumber) mapping(uint256 => IGNS.LegacySubgraphKey) public legacySubgraphKeys; - /// Store data for all NFT-based (v2) subgraphs. + /// @notice Store data for all NFT-based (v2) subgraphs. /// subgraphID => SubgraphData mapping(uint256 => IGNS.SubgraphData) public subgraphs; - /// Contract that represents subgraph ownership through an NFT + /// @notice Contract that represents subgraph ownership through an NFT ISubgraphNFT public subgraphNFT; } /** * @title GNSV3Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the base GNS contract, version 3. * @dev Note that this is the first version that includes a storage gap - if adding * future versions, make sure to move the gap to the new version and * reduce the size of the gap accordingly. */ abstract contract GNSV3Storage is GNSV2Storage, Initializable { - /// Address of the counterpart GNS contract (L1GNS/L2GNS) + /// @notice Address of the counterpart GNS contract (L1GNS/L2GNS) address public counterpartGNSAddress; /// @dev Gap to allow adding variables in future upgrades (since L1GNS and L2GNS have their own storage as well) uint256[50] private __gap; diff --git a/packages/contracts/contracts/discovery/IGNS.sol b/packages/contracts/contracts/discovery/IGNS.sol index 70b366d9b..98f4b339e 100644 --- a/packages/contracts/contracts/discovery/IGNS.sol +++ b/packages/contracts/contracts/discovery/IGNS.sol @@ -4,6 +4,8 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Interface for GNS + * @author Edge & Node + * @notice Interface for the Graph Name System (GNS) contract */ interface IGNS { // -- Pool -- @@ -12,6 +14,13 @@ interface IGNS { * @dev The SubgraphData struct holds information about subgraphs * and their signal; both nSignal (i.e. name signal at the GNS level) * and vSignal (i.e. version signal at the Curation contract level) + * @param vSignal The token of the subgraph-deployment bonding curve + * @param nSignal The token of the subgraph bonding curve + * @param curatorNSignal Mapping of curator addresses to their name signal amounts + * @param subgraphDeploymentID The deployment ID this subgraph points to + * @param __DEPRECATED_reserveRatio Deprecated reserve ratio field + * @param disabled Whether the subgraph is disabled/deprecated + * @param withdrawableGRT Amount of GRT available for withdrawal after deprecation */ struct SubgraphData { uint256 vSignal; // The token of the subgraph-deployment bonding curve @@ -26,6 +35,8 @@ interface IGNS { /** * @dev The LegacySubgraphKey struct holds the account and sequence ID * used to generate subgraph IDs in legacy subgraphs. + * @param account The account that created the legacy subgraph + * @param accountSeqID The sequence ID for the account's subgraphs */ struct LegacySubgraphKey { address account; @@ -158,7 +169,9 @@ interface IGNS { * @notice Calculate subgraph signal to be returned for an amount of tokens. * @param _subgraphID Subgraph ID * @param _tokensIn Tokens being exchanged for subgraph signal - * @return Amount of subgraph signal and curation tax + * @return Amount of subgraph signal that can be bought + * @return Amount of version signal that can be bought + * @return Amount of curation tax */ function tokensToNSignal(uint256 _subgraphID, uint256 _tokensIn) external view returns (uint256, uint256, uint256); @@ -167,6 +180,7 @@ interface IGNS { * @param _subgraphID Subgraph ID * @param _nSignalIn Subgraph signal being exchanged for tokens * @return Amount of tokens returned for an amount of subgraph signal + * @return Amount of version signal returned */ function nSignalToTokens(uint256 _subgraphID, uint256 _nSignalIn) external view returns (uint256, uint256); diff --git a/packages/contracts/contracts/discovery/IServiceRegistry.sol b/packages/contracts/contracts/discovery/IServiceRegistry.sol index 724f7bebe..89dafafd3 100644 --- a/packages/contracts/contracts/discovery/IServiceRegistry.sol +++ b/packages/contracts/contracts/discovery/IServiceRegistry.sol @@ -2,19 +2,52 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Service Registry Interface + * @author Edge & Node + * @notice Interface for the Service Registry contract that manages indexer service information + */ interface IServiceRegistry { + /** + * @dev Indexer service information + * @param url URL of the indexer service + * @param geohash Geohash of the indexer service location + */ struct IndexerService { string url; string geohash; } + /** + * @notice Register an indexer service + * @param _url URL of the indexer service + * @param _geohash Geohash of the indexer service location + */ function register(string calldata _url, string calldata _geohash) external; + /** + * @notice Register an indexer service + * @param _indexer Address of the indexer + * @param _url URL of the indexer service + * @param _geohash Geohash of the indexer service location + */ function registerFor(address _indexer, string calldata _url, string calldata _geohash) external; + /** + * @notice Unregister an indexer service + */ function unregister() external; + /** + * @notice Unregister an indexer service + * @param _indexer Address of the indexer + */ function unregisterFor(address _indexer) external; + /** + * @notice Return the registration status of an indexer service + * @param _indexer Address of the indexer + * @return True if the indexer service is registered + */ function isRegistered(address _indexer) external view returns (bool); } diff --git a/packages/contracts/contracts/discovery/ISubgraphNFT.sol b/packages/contracts/contracts/discovery/ISubgraphNFT.sol index 6cef69297..f735c00f6 100644 --- a/packages/contracts/contracts/discovery/ISubgraphNFT.sol +++ b/packages/contracts/contracts/discovery/ISubgraphNFT.sol @@ -2,24 +2,66 @@ pragma solidity ^0.7.6 || 0.8.27; -import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +/** + * @title Subgraph NFT Interface + * @author Edge & Node + * @notice Interface for the Subgraph NFT contract that represents subgraph ownership + */ interface ISubgraphNFT is IERC721 { // -- Config -- + /** + * @notice Set the minter allowed to perform actions on the NFT + * @dev Minter can mint, burn and update the metadata + * @param _minter Address of the allowed minter + */ function setMinter(address _minter) external; + /** + * @notice Set the token descriptor contract + * @dev Token descriptor can be zero. If set, it must be a contract + * @param _tokenDescriptor Address of the contract that creates the NFT token URI + */ function setTokenDescriptor(address _tokenDescriptor) external; + /** + * @notice Set the base URI + * @dev Can be set to empty + * @param _baseURI Base URI to use to build the token URI + */ function setBaseURI(string memory _baseURI) external; // -- Actions -- + /** + * @notice Mint `_tokenId` and transfers it to `_to` + * @dev `tokenId` must not exist and `to` cannot be the zero address + * @param _to Address receiving the minted NFT + * @param _tokenId ID of the NFT + */ function mint(address _to, uint256 _tokenId) external; + /** + * @notice Burn `_tokenId` + * @dev The approval is cleared when the token is burned + * @param _tokenId ID of the NFT + */ function burn(uint256 _tokenId) external; + /** + * @notice Set the metadata for a subgraph represented by `_tokenId` + * @dev `_tokenId` must exist + * @param _tokenId ID of the NFT + * @param _subgraphMetadata IPFS hash for the metadata + */ function setSubgraphMetadata(uint256 _tokenId, bytes32 _subgraphMetadata) external; + /** + * @notice Returns the Uniform Resource Identifier (URI) for `_tokenId` token + * @param _tokenId ID of the NFT + * @return The URI for the token + */ function tokenURI(uint256 _tokenId) external view returns (string memory); } diff --git a/packages/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol b/packages/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol index cd0785dcb..5a6893234 100644 --- a/packages/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol +++ b/packages/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol @@ -2,7 +2,11 @@ pragma solidity ^0.7.6; -/// @title Describes subgraph NFT tokens via URI +/** + * @title Describes subgraph NFT tokens via URI + * @author Edge & Node + * @notice Interface for describing subgraph NFT tokens via URI + */ interface ISubgraphNFTDescriptor { /// @notice Produces the URI describing a particular token ID for a Subgraph /// @dev Note this URI may be data: URI with the JSON contents directly inlined diff --git a/packages/contracts/contracts/discovery/L1GNS.sol b/packages/contracts/contracts/discovery/L1GNS.sol index 31e9b0fb3..03167dcd9 100644 --- a/packages/contracts/contracts/discovery/L1GNS.sol +++ b/packages/contracts/contracts/discovery/L1GNS.sol @@ -14,7 +14,8 @@ import { L1GNSV1Storage } from "./L1GNSStorage.sol"; /** * @title L1GNS - * @dev The Graph Name System contract provides a decentralized naming system for subgraphs + * @author Edge & Node + * @notice The Graph Name System contract provides a decentralized naming system for subgraphs * used in the scope of the Graph Network. It translates Subgraphs into Subgraph Versions. * Each version is associated with a Subgraph Deployment. The contract has no knowledge of * human-readable names. All human readable names emitted in events. @@ -25,7 +26,13 @@ import { L1GNSV1Storage } from "./L1GNSStorage.sol"; contract L1GNS is GNS, L1GNSV1Storage { using SafeMathUpgradeable for uint256; - /// @dev Emitted when a subgraph was sent to L2 through the bridge + /** + * @notice Emitted when a subgraph was sent to L2 through the bridge + * @param _subgraphID ID of the subgraph being transferred + * @param _l1Owner Address of the subgraph owner on L1 + * @param _l2Owner Address that will own the subgraph on L2 + * @param _tokens Amount of tokens transferred with the subgraph + */ event SubgraphSentToL2( uint256 indexed _subgraphID, address indexed _l1Owner, @@ -33,7 +40,13 @@ contract L1GNS is GNS, L1GNSV1Storage { uint256 _tokens ); - /// @dev Emitted when a curator's balance for a subgraph was sent to L2 + /** + * @notice Emitted when a curator's balance for a subgraph was sent to L2 + * @param _subgraphID ID of the subgraph + * @param _l1Curator Address of the curator on L1 + * @param _l2Beneficiary Address that will receive the tokens on L2 + * @param _tokens Amount of tokens transferred + */ event CuratorBalanceSentToL2( uint256 indexed _subgraphID, address indexed _l1Curator, @@ -42,10 +55,10 @@ contract L1GNS is GNS, L1GNSV1Storage { ); /** - * @notice Send a subgraph's data and tokens to L2. - * Use the Arbitrum SDK to estimate the L2 retryable ticket parameters. + * @notice Send a subgraph's data and tokens to L2 + * @dev Use the Arbitrum SDK to estimate the L2 retryable ticket parameters. * Note that any L2 gas/fee refunds will be lost, so the function only accepts - * the exact amount of ETH to cover _maxSubmissionCost + _maxGas * _gasPriceBid. + * the exact amount of ETH to cover _maxSubmissionCost + _maxGas * _gasPriceBid * @param _subgraphID Subgraph ID * @param _l2Owner Address that will own the subgraph in L2 (could be the L1 owner, but could be different if the L1 owner is an L1 contract) * @param _maxGas Max gas to use for the L2 retryable ticket diff --git a/packages/contracts/contracts/discovery/L1GNSStorage.sol b/packages/contracts/contracts/discovery/L1GNSStorage.sol index 557814513..72af676f2 100644 --- a/packages/contracts/contracts/discovery/L1GNSStorage.sol +++ b/packages/contracts/contracts/discovery/L1GNSStorage.sol @@ -1,16 +1,20 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity ^0.7.6; pragma abicoder v2; /** * @title L1GNSV1Storage + * @author Edge & Node * @notice This contract holds all the L1-specific storage variables for the L1GNS contract, version 1 * @dev When adding new versions, make sure to move the gap to the new version and * reduce the size of the gap accordingly. */ abstract contract L1GNSV1Storage { - /// True for subgraph IDs that have been transferred to L2 + /// @notice True for subgraph IDs that have been transferred to L2 mapping(uint256 => bool) public subgraphTransferredToL2; /// @dev Storage gap to keep storage slots fixed in future versions uint256[50] private __gap; diff --git a/packages/contracts/contracts/discovery/ServiceRegistry.sol b/packages/contracts/contracts/discovery/ServiceRegistry.sol index 1eb1393d3..3fa27f452 100644 --- a/packages/contracts/contracts/discovery/ServiceRegistry.sol +++ b/packages/contracts/contracts/discovery/ServiceRegistry.sol @@ -3,58 +3,68 @@ pragma solidity ^0.7.6; pragma abicoder v2; -import "../governance/Managed.sol"; -import "../upgrades/GraphUpgradeable.sol"; +import { Managed } from "../governance/Managed.sol"; +import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; -import "./ServiceRegistryStorage.sol"; -import "./IServiceRegistry.sol"; +import { ServiceRegistryV1Storage } from "./ServiceRegistryStorage.sol"; +import { IServiceRegistry } from "./IServiceRegistry.sol"; /** * @title ServiceRegistry contract - * @dev This contract supports the service discovery process by allowing indexers to + * @author Edge & Node + * @notice This contract supports the service discovery process by allowing indexers to * register their service url and any other relevant information. */ contract ServiceRegistry is ServiceRegistryV1Storage, GraphUpgradeable, IServiceRegistry { // -- Events -- + /** + * @notice Emitted when an indexer registers their service + * @param indexer Address of the indexer + * @param url URL of the indexer service + * @param geohash Geohash of the indexer service location + */ event ServiceRegistered(address indexed indexer, string url, string geohash); + + /** + * @notice Emitted when an indexer unregisters their service + * @param indexer Address of the indexer + */ event ServiceUnregistered(address indexed indexer); /** - * @dev Check if the caller is authorized (indexer or operator) + * @notice Check if the caller is authorized (indexer or operator) + * @param _indexer Address of the indexer to check authorization for + * @return True if the caller is authorized, false otherwise */ function _isAuth(address _indexer) internal view returns (bool) { return msg.sender == _indexer || staking().isOperator(msg.sender, _indexer) == true; } /** - * @dev Initialize this contract. + * @notice Initialize this contract. + * @param _controller Address of the controller contract */ function initialize(address _controller) external onlyImpl { Managed._initialize(_controller); } /** - * @dev Register an indexer service - * @param _url URL of the indexer service - * @param _geohash Geohash of the indexer service location + * @inheritdoc IServiceRegistry */ function register(string calldata _url, string calldata _geohash) external override { _register(msg.sender, _url, _geohash); } /** - * @dev Register an indexer service - * @param _indexer Address of the indexer - * @param _url URL of the indexer service - * @param _geohash Geohash of the indexer service location + * @inheritdoc IServiceRegistry */ function registerFor(address _indexer, string calldata _url, string calldata _geohash) external override { _register(_indexer, _url, _geohash); } /** - * @dev Internal: Register an indexer service + * @notice Internal: Register an indexer service * @param _indexer Address of the indexer * @param _url URL of the indexer service * @param _geohash Geohash of the indexer service location @@ -69,22 +79,21 @@ contract ServiceRegistry is ServiceRegistryV1Storage, GraphUpgradeable, IService } /** - * @dev Unregister an indexer service + * @inheritdoc IServiceRegistry */ function unregister() external override { _unregister(msg.sender); } /** - * @dev Unregister an indexer service - * @param _indexer Address of the indexer + * @inheritdoc IServiceRegistry */ function unregisterFor(address _indexer) external override { _unregister(_indexer); } /** - * @dev Unregister an indexer service + * @notice Unregister an indexer service * @param _indexer Address of the indexer */ function _unregister(address _indexer) private { @@ -96,8 +105,7 @@ contract ServiceRegistry is ServiceRegistryV1Storage, GraphUpgradeable, IService } /** - * @dev Return the registration status of an indexer service - * @return True if the indexer service is registered + * @inheritdoc IServiceRegistry */ function isRegistered(address _indexer) public view override returns (bool) { return bytes(services[_indexer].url).length > 0; diff --git a/packages/contracts/contracts/discovery/ServiceRegistryStorage.sol b/packages/contracts/contracts/discovery/ServiceRegistryStorage.sol index 1cd484970..23b0cf63d 100644 --- a/packages/contracts/contracts/discovery/ServiceRegistryStorage.sol +++ b/packages/contracts/contracts/discovery/ServiceRegistryStorage.sol @@ -1,13 +1,22 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity ^0.7.6; -import "../governance/Managed.sol"; +import { Managed } from "../governance/Managed.sol"; -import "./IServiceRegistry.sol"; +import { IServiceRegistry } from "./IServiceRegistry.sol"; +/** + * @title Service Registry Storage V1 + * @author Edge & Node + * @notice Storage contract for the Service Registry + */ contract ServiceRegistryV1Storage is Managed { // -- State -- + /// @notice Mapping of indexer addresses to their service information mapping(address => IServiceRegistry.IndexerService) public services; } diff --git a/packages/contracts/contracts/discovery/SubgraphNFT.sol b/packages/contracts/contracts/discovery/SubgraphNFT.sol index 3c514718c..f33766d02 100644 --- a/packages/contracts/contracts/discovery/SubgraphNFT.sol +++ b/packages/contracts/contracts/discovery/SubgraphNFT.sol @@ -2,35 +2,66 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -import "../governance/Governed.sol"; -import "../libraries/HexStrings.sol"; -import "./ISubgraphNFT.sol"; -import "./ISubgraphNFTDescriptor.sol"; - -/// @title NFT that represents ownership of a Subgraph +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-calldata-parameters, gas-indexed-events, gas-small-strings +// solhint-disable named-parameters-mapping + +import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; + +import { Governed } from "../governance/Governed.sol"; +import { HexStrings } from "../libraries/HexStrings.sol"; +import { ISubgraphNFT } from "./ISubgraphNFT.sol"; +import { ISubgraphNFTDescriptor } from "./ISubgraphNFTDescriptor.sol"; + +/** + * @title NFT that represents ownership of a Subgraph + * @author Edge & Node + * @notice NFT that represents ownership of a Subgraph + */ contract SubgraphNFT is Governed, ERC721, ISubgraphNFT { // -- State -- + /// @notice Address of the minter contract address public minter; + /// @notice Address of the token descriptor contract ISubgraphNFTDescriptor public tokenDescriptor; + /// @dev Mapping from token ID to subgraph metadata hash mapping(uint256 => bytes32) private _subgraphMetadataHashes; // -- Events -- + /** + * @notice Emitted when the minter address is updated + * @param minter Address of the new minter + */ event MinterUpdated(address minter); + + /** + * @notice Emitted when the token descriptor is updated + * @param tokenDescriptor Address of the new token descriptor + */ event TokenDescriptorUpdated(address tokenDescriptor); + + /** + * @notice Emitted when subgraph metadata is updated + * @param tokenID ID of the token + * @param subgraphURI IPFS hash of the subgraph metadata + */ event SubgraphMetadataUpdated(uint256 indexed tokenID, bytes32 subgraphURI); // -- Modifiers -- + /// @dev Modifier to restrict access to minter only modifier onlyMinter() { require(msg.sender == minter, "Must be a minter"); _; } + /** + * @notice Constructor for the SubgraphNFT contract + * @param _governor Address that will have governance privileges + */ constructor(address _governor) ERC721("Subgraph", "SG") { _initialize(_governor); } @@ -38,9 +69,7 @@ contract SubgraphNFT is Governed, ERC721, ISubgraphNFT { // -- Config -- /** - * @notice Set the minter allowed to perform actions on the NFT. - * @dev Minter can mint, burn and update the metadata - * @param _minter Address of the allowed minter + * @inheritdoc ISubgraphNFT */ function setMinter(address _minter) external override onlyGovernor { _setMinter(_minter); @@ -57,16 +86,14 @@ contract SubgraphNFT is Governed, ERC721, ISubgraphNFT { } /** - * @notice Set the token descriptor contract. - * @dev Token descriptor can be zero. If set, it must be a contract. - * @param _tokenDescriptor Address of the contract that creates the NFT token URI + * @inheritdoc ISubgraphNFT */ function setTokenDescriptor(address _tokenDescriptor) external override onlyGovernor { _setTokenDescriptor(_tokenDescriptor); } /** - * @dev Internal: Set the token descriptor contract used to create the ERC-721 metadata URI. + * @notice Internal: Set the token descriptor contract used to create the ERC-721 metadata URI. * @param _tokenDescriptor Address of the contract that creates the NFT token URI */ function _setTokenDescriptor(address _tokenDescriptor) internal { @@ -79,9 +106,7 @@ contract SubgraphNFT is Governed, ERC721, ISubgraphNFT { } /** - * @notice Set the base URI. - * @dev Can be set to empty. - * @param _baseURI Base URI to use to build the token URI + * @inheritdoc ISubgraphNFT */ function setBaseURI(string memory _baseURI) external override onlyGovernor { _setBaseURI(_baseURI); @@ -90,29 +115,21 @@ contract SubgraphNFT is Governed, ERC721, ISubgraphNFT { // -- Minter actions -- /** - * @notice Mint `_tokenId` and transfers it to `_to`. - * @dev `tokenId` must not exist and `to` cannot be the zero address. - * @param _to Address receiving the minted NFT - * @param _tokenId ID of the NFT + * @inheritdoc ISubgraphNFT */ function mint(address _to, uint256 _tokenId) external override onlyMinter { _mint(_to, _tokenId); } /** - * @notice Burn `_tokenId`. - * @dev The approval is cleared when the token is burned. - * @param _tokenId ID of the NFT + * @inheritdoc ISubgraphNFT */ function burn(uint256 _tokenId) external override onlyMinter { _burn(_tokenId); } /** - * @notice Set the metadata for a subgraph represented by `_tokenId`. - * @dev `_tokenId` must exist. - * @param _tokenId ID of the NFT - * @param _subgraphMetadata IPFS hash for the metadata + * @inheritdoc ISubgraphNFT */ function setSubgraphMetadata(uint256 _tokenId, bytes32 _subgraphMetadata) external override onlyMinter { require(_exists(_tokenId), "ERC721Metadata: URI set of nonexistent token"); diff --git a/packages/contracts/contracts/discovery/SubgraphNFTDescriptor.sol b/packages/contracts/contracts/discovery/SubgraphNFTDescriptor.sol index 81f6da696..a21cadfb7 100644 --- a/packages/contracts/contracts/discovery/SubgraphNFTDescriptor.sol +++ b/packages/contracts/contracts/discovery/SubgraphNFTDescriptor.sol @@ -2,10 +2,14 @@ pragma solidity ^0.7.6; -import "../libraries/Base58Encoder.sol"; -import "./ISubgraphNFTDescriptor.sol"; +import { Base58Encoder } from "../libraries/Base58Encoder.sol"; +import { ISubgraphNFTDescriptor } from "./ISubgraphNFTDescriptor.sol"; -/// @title Describes subgraph NFT tokens via URI +/** + * @title Describes subgraph NFT tokens via URI + * @author Edge & Node + * @notice Describes subgraph NFT tokens via URI + */ contract SubgraphNFTDescriptor is ISubgraphNFTDescriptor { /// @inheritdoc ISubgraphNFTDescriptor function tokenURI( diff --git a/packages/contracts/contracts/discovery/erc1056/EthereumDIDRegistry.sol b/packages/contracts/contracts/discovery/erc1056/EthereumDIDRegistry.sol index e8545dd4a..76c1a41f9 100644 --- a/packages/contracts/contracts/discovery/erc1056/EthereumDIDRegistry.sol +++ b/packages/contracts/contracts/discovery/erc1056/EthereumDIDRegistry.sol @@ -12,19 +12,51 @@ As well as all testnets pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one, gas-indexed-events, gas-small-strings +// solhint-disable named-parameters-mapping + +/** + * @title Ethereum DID Registry + * @author Edge & Node + * @notice Registry for Ethereum Decentralized Identifiers (DIDs) + */ contract EthereumDIDRegistry { + /// @notice Mapping of identity addresses to their owners mapping(address => address) public owners; + /// @notice Mapping of identity addresses to delegate types to delegate addresses to validity periods mapping(address => mapping(bytes32 => mapping(address => uint256))) public delegates; + /// @notice Mapping of identity addresses to their last change block numbers mapping(address => uint256) public changed; + /// @notice Mapping of identity addresses to their nonce values mapping(address => uint256) public nonce; + /** + * @notice Modifier to restrict access to identity owners only + * @param identity The identity address + * @param actor The address performing the action + */ modifier onlyOwner(address identity, address actor) { require(actor == identityOwner(identity), "Caller must be the identity owner"); _; } + /** + * @notice Emitted when a DID owner is changed + * @param identity The identity address + * @param owner The new owner address + * @param previousChange Block number of the previous change + */ event DIDOwnerChanged(address indexed identity, address owner, uint256 previousChange); + /** + * @notice Emitted when a DID delegate is changed + * @param identity The identity address + * @param delegateType The type of delegate + * @param delegate The delegate address + * @param validTo Timestamp until which the delegate is valid + * @param previousChange Block number of the previous change + */ event DIDDelegateChanged( address indexed identity, bytes32 delegateType, @@ -33,6 +65,14 @@ contract EthereumDIDRegistry { uint256 previousChange ); + /** + * @notice Emitted when a DID attribute is changed + * @param identity The identity address + * @param name The attribute name + * @param value The attribute value + * @param validTo Timestamp until which the attribute is valid + * @param previousChange Block number of the previous change + */ event DIDAttributeChanged( address indexed identity, bytes32 name, @@ -41,6 +81,11 @@ contract EthereumDIDRegistry { uint256 previousChange ); + /** + * @notice Get the owner of an identity + * @param identity The identity address + * @return The address of the identity owner + */ function identityOwner(address identity) public view returns (address) { address owner = owners[identity]; if (owner != address(0)) { @@ -49,6 +94,15 @@ contract EthereumDIDRegistry { return identity; } + /** + * @notice Verify signature and return signer address + * @param identity The identity address + * @param sigV Recovery ID of the signature + * @param sigR R component of the signature + * @param sigS S component of the signature + * @param hash Hash that was signed + * @return The address of the signer + */ function checkSignature( address identity, uint8 sigV, @@ -62,22 +116,48 @@ contract EthereumDIDRegistry { return signer; } + /** + * @notice Check if a delegate is valid for an identity + * @param identity The identity address + * @param delegateType The type of delegate + * @param delegate The delegate address + * @return True if the delegate is valid, false otherwise + */ function validDelegate(address identity, bytes32 delegateType, address delegate) public view returns (bool) { uint256 validity = delegates[identity][keccak256(abi.encode(delegateType))][delegate]; /* solium-disable-next-line security/no-block-members*/ return (validity > block.timestamp); } + /** + * @notice Internal function to change the owner of an identity + * @param identity The identity address + * @param actor The address performing the action + * @param newOwner The new owner address + */ function changeOwner(address identity, address actor, address newOwner) internal onlyOwner(identity, actor) { owners[identity] = newOwner; emit DIDOwnerChanged(identity, newOwner, changed[identity]); changed[identity] = block.number; } + /** + * @notice Change the owner of an identity + * @param identity The identity address + * @param newOwner The new owner address + */ function changeOwner(address identity, address newOwner) public { changeOwner(identity, msg.sender, newOwner); } + /** + * @notice Change the owner of an identity using a signed message + * @param identity The identity address + * @param sigV Recovery ID of the signature + * @param sigR R component of the signature + * @param sigS S component of the signature + * @param newOwner The new owner address + */ function changeOwnerSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, address newOwner) public { bytes32 hash = keccak256( abi.encodePacked( @@ -93,6 +173,14 @@ contract EthereumDIDRegistry { changeOwner(identity, checkSignature(identity, sigV, sigR, sigS, hash), newOwner); } + /** + * @notice Internal function to add a delegate for an identity + * @param identity The identity address + * @param actor The address performing the action + * @param delegateType The type of delegate + * @param delegate The delegate address + * @param validity The validity period in seconds + */ function addDelegate( address identity, address actor, @@ -113,10 +201,27 @@ contract EthereumDIDRegistry { changed[identity] = block.number; } + /** + * @notice Add a delegate for an identity + * @param identity The identity to add a delegate for + * @param delegateType The type of delegate + * @param delegate The address of the delegate + * @param validity The validity period in seconds + */ function addDelegate(address identity, bytes32 delegateType, address delegate, uint256 validity) public { addDelegate(identity, msg.sender, delegateType, delegate, validity); } + /** + * @notice Add a delegate for an identity using a signed message + * @param identity The identity to add a delegate for + * @param sigV The recovery id of the signature + * @param sigR The r component of the signature + * @param sigS The s component of the signature + * @param delegateType The type of delegate + * @param delegate The address of the delegate + * @param validity The validity period in seconds + */ function addDelegateSigned( address identity, uint8 sigV, @@ -142,6 +247,13 @@ contract EthereumDIDRegistry { addDelegate(identity, checkSignature(identity, sigV, sigR, sigS, hash), delegateType, delegate, validity); } + /** + * @notice Internal function to revoke a delegate for an identity + * @param identity The identity address + * @param actor The address performing the action + * @param delegateType The type of delegate + * @param delegate The delegate address + */ function revokeDelegate( address identity, address actor, @@ -155,10 +267,25 @@ contract EthereumDIDRegistry { changed[identity] = block.number; } + /** + * @notice Revoke a delegate for an identity + * @param identity The identity to revoke a delegate for + * @param delegateType The type of delegate + * @param delegate The address of the delegate + */ function revokeDelegate(address identity, bytes32 delegateType, address delegate) public { revokeDelegate(identity, msg.sender, delegateType, delegate); } + /** + * @notice Revoke a delegate for an identity using a signed message + * @param identity The identity to revoke a delegate for + * @param sigV The recovery id of the signature + * @param sigR The r component of the signature + * @param sigS The s component of the signature + * @param delegateType The type of delegate + * @param delegate The address of the delegate + */ function revokeDelegateSigned( address identity, uint8 sigV, @@ -182,6 +309,14 @@ contract EthereumDIDRegistry { revokeDelegate(identity, checkSignature(identity, sigV, sigR, sigS, hash), delegateType, delegate); } + /** + * @notice Internal function to set an attribute for an identity + * @param identity The identity address + * @param actor The address performing the action + * @param name The attribute name + * @param value The attribute value + * @param validity The validity period in seconds + */ function setAttribute( address identity, address actor, @@ -194,10 +329,27 @@ contract EthereumDIDRegistry { changed[identity] = block.number; } + /** + * @notice Set an attribute for an identity + * @param identity The identity to set an attribute for + * @param name The name of the attribute + * @param value The value of the attribute + * @param validity The validity period in seconds + */ function setAttribute(address identity, bytes32 name, bytes memory value, uint256 validity) public { setAttribute(identity, msg.sender, name, value, validity); } + /** + * @notice Set an attribute for an identity using a signed message + * @param identity The identity to set an attribute for + * @param sigV The recovery id of the signature + * @param sigR The r component of the signature + * @param sigS The s component of the signature + * @param name The name of the attribute + * @param value The value of the attribute + * @param validity The validity period in seconds + */ function setAttributeSigned( address identity, uint8 sigV, @@ -223,6 +375,13 @@ contract EthereumDIDRegistry { setAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value, validity); } + /** + * @notice Internal function to revoke an attribute for an identity + * @param identity The identity address + * @param actor The address performing the action + * @param name The attribute name + * @param value The attribute value + */ function revokeAttribute( address identity, address actor, @@ -233,10 +392,25 @@ contract EthereumDIDRegistry { changed[identity] = block.number; } + /** + * @notice Revoke an attribute for an identity + * @param identity The identity to revoke an attribute for + * @param name The name of the attribute + * @param value The value of the attribute + */ function revokeAttribute(address identity, bytes32 name, bytes memory value) public { revokeAttribute(identity, msg.sender, name, value); } + /** + * @notice Revoke an attribute for an identity using a signed message + * @param identity The identity to revoke an attribute for + * @param sigV The recovery id of the signature + * @param sigR The r component of the signature + * @param sigS The s component of the signature + * @param name The name of the attribute + * @param value The value of the attribute + */ function revokeAttributeSigned( address identity, uint8 sigV, diff --git a/packages/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol b/packages/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol index 8de69f304..0be104968 100644 --- a/packages/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol +++ b/packages/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol @@ -2,8 +2,25 @@ pragma solidity ^0.7.6; +/** + * @title Ethereum DID Registry Interface + * @author Edge & Node + * @notice Interface for the Ethereum DID Registry contract + */ interface IEthereumDIDRegistry { + /** + * @notice Get the owner of an identity + * @param identity The identity address + * @return The address of the identity owner + */ function identityOwner(address identity) external view returns (address); + /** + * @notice Set an attribute for an identity + * @param identity The identity address + * @param name The attribute name + * @param value The attribute value + * @param validity The validity period in seconds + */ function setAttribute(address identity, bytes32 name, bytes calldata value, uint256 validity) external; } diff --git a/packages/contracts/contracts/disputes/DisputeManager.sol b/packages/contracts/contracts/disputes/DisputeManager.sol index 013a21b03..ba3e25efd 100644 --- a/packages/contracts/contracts/disputes/DisputeManager.sol +++ b/packages/contracts/contracts/disputes/DisputeManager.sol @@ -3,18 +3,23 @@ pragma solidity ^0.7.6; pragma abicoder v2; -import "@openzeppelin/contracts/math/SafeMath.sol"; -import "@openzeppelin/contracts/cryptography/ECDSA.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings, gas-strict-inequalities -import "../governance/Managed.sol"; -import "../upgrades/GraphUpgradeable.sol"; -import "../utils/TokenUtils.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { ECDSA } from "@openzeppelin/contracts/cryptography/ECDSA.sol"; -import "./DisputeManagerStorage.sol"; -import "./IDisputeManager.sol"; +import { Managed } from "../governance/Managed.sol"; +import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; +import { TokenUtils } from "../utils/TokenUtils.sol"; +import { IStaking } from "../staking/IStaking.sol"; -/* +import { DisputeManagerV1Storage } from "./DisputeManagerStorage.sol"; +import { IDisputeManager } from "./IDisputeManager.sol"; + +/** * @title DisputeManager + * @author Edge & Node * @notice Provides a way to align the incentives of participants by having slashing as deterrent * for incorrect behaviour. * @@ -41,39 +46,61 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa // -- EIP-712 -- + /// @dev EIP-712 domain type hash for signature verification bytes32 private constant DOMAIN_TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"); + /// @dev EIP-712 domain name hash bytes32 private constant DOMAIN_NAME_HASH = keccak256("Graph Protocol"); + /// @dev EIP-712 domain version hash bytes32 private constant DOMAIN_VERSION_HASH = keccak256("0"); + /// @dev EIP-712 domain salt for uniqueness bytes32 private constant DOMAIN_SALT = 0xa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c2; + /// @dev EIP-712 receipt type hash for attestation verification bytes32 private constant RECEIPT_TYPE_HASH = keccak256("Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)"); // -- Constants -- - // Attestation size is the sum of the receipt (96) + signature (65) + /// @dev Total size of attestation in bytes (receipt + signature) uint256 private constant ATTESTATION_SIZE_BYTES = RECEIPT_SIZE_BYTES + SIG_SIZE_BYTES; + /// @dev Size of receipt in bytes uint256 private constant RECEIPT_SIZE_BYTES = 96; + /// @dev Length of signature R component in bytes uint256 private constant SIG_R_LENGTH = 32; + /// @dev Length of signature S component in bytes uint256 private constant SIG_S_LENGTH = 32; + /// @dev Length of signature V component in bytes uint256 private constant SIG_V_LENGTH = 1; + /// @dev Offset of signature R component in attestation data uint256 private constant SIG_R_OFFSET = RECEIPT_SIZE_BYTES; + /// @dev Offset of signature S component in attestation data uint256 private constant SIG_S_OFFSET = RECEIPT_SIZE_BYTES + SIG_R_LENGTH; + /// @dev Offset of signature V component in attestation data uint256 private constant SIG_V_OFFSET = RECEIPT_SIZE_BYTES + SIG_R_LENGTH + SIG_S_LENGTH; + /// @dev Total size of signature in bytes uint256 private constant SIG_SIZE_BYTES = SIG_R_LENGTH + SIG_S_LENGTH + SIG_V_LENGTH; + /// @dev Length of uint8 type in bytes uint256 private constant UINT8_BYTE_LENGTH = 1; + /// @dev Length of bytes32 type in bytes uint256 private constant BYTES32_BYTE_LENGTH = 32; + /// @dev Maximum percentage in parts per million (100%) uint256 private constant MAX_PPM = 1000000; // 100% in parts per million // -- Events -- /** - * @dev Emitted when a query dispute is created for `subgraphDeploymentID` and `indexer` + * @notice Emitted when a query dispute is created for `subgraphDeploymentID` and `indexer` * by `fisherman`. * The event emits the amount of `tokens` deposited by the fisherman and `attestation` submitted. + * @param disputeID ID of the dispute + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the fisherman creating the dispute + * @param tokens Amount of tokens deposited by the fisherman + * @param subgraphDeploymentID Subgraph deployment ID being disputed + * @param attestation Attestation data submitted */ event QueryDisputeCreated( bytes32 indexed disputeID, @@ -85,9 +112,14 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa ); /** - * @dev Emitted when an indexing dispute is created for `allocationID` and `indexer` + * @notice Emitted when an indexing dispute is created for `allocationID` and `indexer` * by `fisherman`. * The event emits the amount of `tokens` deposited by the fisherman. + * @param disputeID ID of the dispute + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the fisherman creating the dispute + * @param tokens Amount of tokens deposited by the fisherman + * @param allocationID Allocation ID being disputed */ event IndexingDisputeCreated( bytes32 indexed disputeID, @@ -98,8 +130,12 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa ); /** - * @dev Emitted when arbitrator accepts a `disputeID` to `indexer` created by `fisherman`. + * @notice Emitted when arbitrator accepts a `disputeID` to `indexer` created by `fisherman`. * The event emits the amount `tokens` transferred to the fisherman, the deposit plus reward. + * @param disputeID ID of the dispute + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the fisherman who created the dispute + * @param tokens Amount of tokens transferred to the fisherman (deposit plus reward) */ event DisputeAccepted( bytes32 indexed disputeID, @@ -109,8 +145,12 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa ); /** - * @dev Emitted when arbitrator rejects a `disputeID` for `indexer` created by `fisherman`. + * @notice Emitted when arbitrator rejects a `disputeID` for `indexer` created by `fisherman`. * The event emits the amount `tokens` burned from the fisherman deposit. + * @param disputeID ID of the dispute + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the fisherman who created the dispute + * @param tokens Amount of tokens burned from the fisherman deposit */ event DisputeRejected( bytes32 indexed disputeID, @@ -120,20 +160,29 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa ); /** - * @dev Emitted when arbitrator draw a `disputeID` for `indexer` created by `fisherman`. + * @notice Emitted when arbitrator draw a `disputeID` for `indexer` created by `fisherman`. * The event emits the amount `tokens` used as deposit and returned to the fisherman. + * @param disputeID ID of the dispute + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the fisherman who created the dispute + * @param tokens Amount of tokens used as deposit and returned to the fisherman */ event DisputeDrawn(bytes32 indexed disputeID, address indexed indexer, address indexed fisherman, uint256 tokens); /** - * @dev Emitted when two disputes are in conflict to link them. + * @notice Emitted when two disputes are in conflict to link them. * This event will be emitted after each DisputeCreated event is emitted * for each of the individual disputes. + * @param disputeID1 ID of the first dispute + * @param disputeID2 ID of the second dispute */ event DisputeLinked(bytes32 indexed disputeID1, bytes32 indexed disputeID2); // -- Modifiers -- + /** + * @notice Internal function to check if the caller is the arbitrator + */ function _onlyArbitrator() internal view { require(msg.sender == arbitrator, "Caller is not the Arbitrator"); } @@ -146,6 +195,10 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa _; } + /** + * @dev Check if the dispute exists and is pending + * @param _disputeID ID of the dispute to check + */ modifier onlyPendingDispute(bytes32 _disputeID) { require(isDisputeCreated(_disputeID), "Dispute does not exist"); require(disputes[_disputeID].status == IDisputeManager.DisputeStatus.Pending, "Dispute must be pending"); @@ -155,7 +208,8 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa // -- Functions -- /** - * @dev Initialize this contract. + * @notice Initialize this contract. + * @param _controller Controller address * @param _arbitrator Arbitrator role * @param _minimumDeposit Minimum deposit required to create a Dispute * @param _fishermanRewardPercentage Percent of slashed funds for fisherman (ppm) @@ -192,16 +246,13 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Set the arbitrator address. - * @notice Update the arbitrator to `_arbitrator` - * @param _arbitrator The address of the arbitration contract or party + * @inheritdoc IDisputeManager */ function setArbitrator(address _arbitrator) external override onlyGovernor { _setArbitrator(_arbitrator); } /** - * @dev Internal: Set the arbitrator address. * @notice Update the arbitrator to `_arbitrator` * @param _arbitrator The address of the arbitration contract or party */ @@ -212,16 +263,13 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Set the minimum deposit required to create a dispute. - * @notice Update the minimum deposit to `_minimumDeposit` Graph Tokens - * @param _minimumDeposit The minimum deposit in Graph Tokens + * @inheritdoc IDisputeManager */ function setMinimumDeposit(uint256 _minimumDeposit) external override onlyGovernor { _setMinimumDeposit(_minimumDeposit); } /** - * @dev Internal: Set the minimum deposit required to create a dispute. * @notice Update the minimum deposit to `_minimumDeposit` Graph Tokens * @param _minimumDeposit The minimum deposit in Graph Tokens */ @@ -232,17 +280,14 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Set the percent reward that the fisherman gets when slashing occurs. - * @notice Update the reward percentage to `_percentage` - * @param _percentage Reward as a percentage of indexer stake + * @inheritdoc IDisputeManager */ function setFishermanRewardPercentage(uint32 _percentage) external override onlyGovernor { _setFishermanRewardPercentage(_percentage); } /** - * @dev Internal: Set the percent reward that the fisherman gets when slashing occurs. - * @notice Update the reward percentage to `_percentage` + * @notice Set the percent reward that the fisherman gets when slashing occurs. * @param _percentage Reward as a percentage of indexer stake */ function _setFishermanRewardPercentage(uint32 _percentage) private { @@ -253,16 +298,14 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Set the percentage used for slashing indexers. - * @param _qryPercentage Percentage slashing for query disputes - * @param _idxPercentage Percentage slashing for indexing disputes + * @inheritdoc IDisputeManager */ function setSlashingPercentage(uint32 _qryPercentage, uint32 _idxPercentage) external override onlyGovernor { _setSlashingPercentage(_qryPercentage, _idxPercentage); } /** - * @dev Internal: Set the percentage used for slashing indexers. + * @notice Internal: Set the percentage used for slashing indexers. * @param _qryPercentage Percentage slashing for query disputes * @param _idxPercentage Percentage slashing for indexing disputes */ @@ -279,21 +322,16 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Return whether a dispute exists or not. - * @notice Return if dispute with ID `_disputeID` exists - * @param _disputeID True if dispute already exists + * @inheritdoc IDisputeManager */ function isDisputeCreated(bytes32 _disputeID) public view override returns (bool) { return disputes[_disputeID].status != DisputeStatus.Null; } /** - * @dev Get the message hash that an indexer used to sign the receipt. - * Encodes a receipt using a domain separator, as described on + * @inheritdoc IDisputeManager + * @dev Encodes a receipt using a domain separator, as described on * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification. - * @notice Return the message hash used to sign the receipt - * @param _receipt Receipt returned by indexer and submitted by fisherman - * @return Message hash used to sign the receipt */ function encodeHashReceipt(Receipt memory _receipt) public view override returns (bytes32) { return @@ -314,11 +352,8 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Returns if two attestations are conflicting. - * Everything must match except for the responseID. - * @param _attestation1 Attestation - * @param _attestation2 Attestation - * @return True if the two attestations are conflicting + * @inheritdoc IDisputeManager + * @dev Everything must match except for the responseID. */ function areConflictingAttestations( Attestation memory _attestation1, @@ -330,9 +365,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Returns the indexer that signed an attestation. - * @param _attestation Attestation - * @return Indexer address + * @inheritdoc IDisputeManager */ function getAttestationIndexer(Attestation memory _attestation) public view override returns (address) { // Get attestation signer. Indexers signs with the allocationID @@ -348,11 +381,9 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Create a query dispute for the arbitrator to resolve. - * This function is called by a fisherman that will need to `_deposit` at + * @inheritdoc IDisputeManager + * @dev This function is called by a fisherman that will need to `_deposit` at * least `minimumDeposit` GRT tokens. - * @param _attestationData Attestation bytes submitted by the fisherman - * @param _deposit Amount of tokens staked as deposit */ function createQueryDispute(bytes calldata _attestationData, uint256 _deposit) external override returns (bytes32) { // Get funds from submitter @@ -369,16 +400,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Create query disputes for two conflicting attestations. - * A conflicting attestation is a proof presented by two different indexers - * where for the same request on a subgraph the response is different. - * For this type of dispute the submitter is not required to present a deposit - * as one of the attestation is considered to be right. - * Two linked disputes will be created and if the arbitrator resolve one, the other - * one will be automatically resolved. - * @param _attestationData1 First attestation data submitted - * @param _attestationData2 Second attestation data submitted - * @return DisputeID1, DisputeID2 + * @inheritdoc IDisputeManager */ function createQueryDisputeConflict( bytes calldata _attestationData1, @@ -409,7 +431,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Create a query dispute passing the parsed attestation. + * @notice Create a query dispute passing the parsed attestation. * To be used in createQueryDispute() and createQueryDisputeConflict() * to avoid calling parseAttestation() multiple times * `_attestationData` is only passed to be emitted @@ -472,8 +494,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa * The disputes are created in reference to an allocationID * This function is called by a challenger that will need to `_deposit` at * least `minimumDeposit` GRT tokens. - * @param _allocationID The allocation to dispute - * @param _deposit Amount of tokens staked as deposit + * @inheritdoc IDisputeManager */ function createIndexingDispute(address _allocationID, uint256 _deposit) external override returns (bytes32) { // Get funds from submitter @@ -484,19 +505,19 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Create indexing dispute internal function. + * @notice Create indexing dispute internal function. * @param _fisherman The challenger creating the dispute * @param _deposit Amount of tokens staked as deposit * @param _allocationID Allocation disputed + * @return disputeID The ID of the created dispute */ - function _createIndexingDisputeWithAllocation( address _fisherman, uint256 _deposit, address _allocationID - ) private returns (bytes32) { + ) private returns (bytes32 disputeID) { // Create a disputeID - bytes32 disputeID = keccak256(abi.encodePacked(_allocationID)); + disputeID = keccak256(abi.encodePacked(_allocationID)); // Only one dispute for an allocationID at a time require(!isDisputeCreated(disputeID), "Dispute already created"); @@ -525,12 +546,10 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev The arbitrator accepts a dispute as being valid. - * This function will revert if the indexer is not slashable, whether because it does not have + * @dev This function will revert if the indexer is not slashable, whether because it does not have * any stake available or the slashing percentage is configured to be zero. In those cases * a dispute must be resolved using drawDispute or rejectDispute. - * @notice Accept a dispute with ID `_disputeID` - * @param _disputeID ID of the dispute to be accepted + * @inheritdoc IDisputeManager */ function acceptDispute(bytes32 _disputeID) external override onlyArbitrator onlyPendingDispute(_disputeID) { Dispute storage dispute = disputes[_disputeID]; @@ -552,9 +571,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev The arbitrator rejects a dispute as being invalid. - * @notice Reject a dispute with ID `_disputeID` - * @param _disputeID ID of the dispute to be rejected + * @inheritdoc IDisputeManager */ function rejectDispute(bytes32 _disputeID) public override onlyArbitrator onlyPendingDispute(_disputeID) { Dispute storage dispute = disputes[_disputeID]; @@ -575,9 +592,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev The arbitrator draws dispute. - * @notice Ignore a dispute with ID `_disputeID` - * @param _disputeID ID of the dispute to be disregarded + * @inheritdoc IDisputeManager */ function drawDispute(bytes32 _disputeID) external override onlyArbitrator onlyPendingDispute(_disputeID) { Dispute storage dispute = disputes[_disputeID]; @@ -595,7 +610,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Returns whether the dispute is for a conflicting attestation or not. + * @notice Returns whether the dispute is for a conflicting attestation or not. * @param _dispute Dispute * @return True conflicting attestation dispute */ @@ -606,7 +621,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Resolve the conflicting dispute if there is any for the one passed to this function. + * @notice Resolve the conflicting dispute if there is any for the one passed to this function. * @param _dispute Dispute * @return True if resolved */ @@ -621,7 +636,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Pull deposit from submitter account. + * @notice Pull deposit from submitter account. * @param _deposit Amount of tokens to deposit */ function _pullSubmitterDeposit(uint256 _deposit) private { @@ -633,7 +648,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Make the staking contract slash the indexer and reward the challenger. + * @notice Make the staking contract slash the indexer and reward the challenger. * Give the challenger a reward equal to the fishermanRewardPercentage of slashed amount * @param _indexer Address of the indexer * @param _challenger Address of the challenger @@ -664,7 +679,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Return the slashing percentage for the dispute type. + * @notice Return the slashing percentage for the dispute type. * @param _disputeType Dispute type * @return Slashing percentage to use for the dispute type */ @@ -675,7 +690,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Recover the signer address of the `_attestation`. + * @notice Recover the signer address of the `_attestation`. * @param _attestation The attestation struct * @return Signer address */ @@ -694,11 +709,12 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Get the running network chain ID + * @notice Get the running network chain ID * @return The chain ID */ function _getChainID() private pure returns (uint256) { uint256 id; + // solhint-disable-next-line no-inline-assembly assembly { id := chainid() } @@ -706,7 +722,8 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Parse the bytes attestation into a struct from `_data`. + * @notice Parse the bytes attestation into a struct from `_data`. + * @param _data The bytes data to parse into an attestation * @return Attestation struct */ function _parseAttestation(bytes memory _data) private pure returns (Attestation memory) { @@ -729,13 +746,16 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Parse a uint8 from `_bytes` starting at offset `_start`. + * @notice Parse a uint8 from `_bytes` starting at offset `_start`. + * @param _bytes The bytes array to parse from + * @param _start The starting offset in the bytes array * @return uint8 value */ function _toUint8(bytes memory _bytes, uint256 _start) private pure returns (uint8) { require(_bytes.length >= (_start + UINT8_BYTE_LENGTH), "Bytes: out of bounds"); uint8 tempUint; + // solhint-disable-next-line no-inline-assembly assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } @@ -744,13 +764,16 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa } /** - * @dev Parse a bytes32 from `_bytes` starting at offset `_start`. + * @notice Parse a bytes32 from `_bytes` starting at offset `_start`. + * @param _bytes The bytes array to parse from + * @param _start The starting offset in the bytes array * @return bytes32 value */ function _toBytes32(bytes memory _bytes, uint256 _start) private pure returns (bytes32) { require(_bytes.length >= (_start + BYTES32_BYTE_LENGTH), "Bytes: out of bounds"); bytes32 tempBytes32; + // solhint-disable-next-line no-inline-assembly assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } diff --git a/packages/contracts/contracts/disputes/DisputeManagerStorage.sol b/packages/contracts/contracts/disputes/DisputeManagerStorage.sol index 4df6e0ae6..f82cff337 100644 --- a/packages/contracts/contracts/disputes/DisputeManagerStorage.sol +++ b/packages/contracts/contracts/disputes/DisputeManagerStorage.sol @@ -1,34 +1,44 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity ^0.7.6; -import "../governance/Managed.sol"; +import { Managed } from "../governance/Managed.sol"; -import "./IDisputeManager.sol"; +import { IDisputeManager } from "./IDisputeManager.sol"; +/** + * @title Dispute Manager Storage V1 + * @author Edge & Node + * @notice Storage contract for the Dispute Manager + */ contract DisputeManagerV1Storage is Managed { // -- State -- - bytes32 internal DOMAIN_SEPARATOR; + /// @dev Domain separator for EIP-712 signature verification + bytes32 internal DOMAIN_SEPARATOR; // solhint-disable-line var-name-mixedcase - // The arbitrator is solely in control of arbitrating disputes + /// @notice The arbitrator is solely in control of arbitrating disputes address public arbitrator; - // Minimum deposit required to create a Dispute + /// @notice Minimum deposit required to create a Dispute uint256 public minimumDeposit; // -- Slot 0xf - // Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute - // Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) + /// @notice Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute + /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) uint32 public fishermanRewardPercentage; - // Percentage of indexer stake to slash on disputes - // Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) + /// @notice Percentage of indexer stake to slash on disputes + /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) uint32 public qrySlashingPercentage; + /// @notice Percentage of indexer stake to slash on disputes uint32 public idxSlashingPercentage; // -- Slot 0x10 - // Disputes created : disputeID => Dispute - // disputeID - check creation functions to see how disputeID is built + /// @notice Disputes created : disputeID => Dispute + /// @dev disputeID - check creation functions to see how disputeID is built mapping(bytes32 => IDisputeManager.Dispute) public disputes; } diff --git a/packages/contracts/contracts/disputes/IDisputeManager.sol b/packages/contracts/contracts/disputes/IDisputeManager.sol index e42386941..0db94e290 100644 --- a/packages/contracts/contracts/disputes/IDisputeManager.sol +++ b/packages/contracts/contracts/disputes/IDisputeManager.sol @@ -1,17 +1,28 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.6.12 <0.8.0 || 0.8.27; +pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +/** + * @title Dispute Manager Interface + * @author Edge & Node + * @notice Interface for the Dispute Manager contract that handles indexing and query disputes + */ interface IDisputeManager { // -- Dispute -- + /** + * @dev Types of disputes that can be created + */ enum DisputeType { Null, IndexingDispute, QueryDispute } + /** + * @dev Status of a dispute + */ enum DisputeStatus { Null, Accepted, @@ -20,7 +31,15 @@ interface IDisputeManager { Pending } - // Disputes contain info necessary for the Arbitrator to verify and resolve + /** + * @dev Disputes contain info necessary for the Arbitrator to verify and resolve + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the challenger creating the dispute + * @param deposit Amount of tokens staked as deposit + * @param relatedDisputeID ID of related dispute (for conflicting attestations) + * @param disputeType Type of dispute (Query or Indexing) + * @param status Current status of the dispute + */ struct Dispute { address indexer; address fisherman; @@ -32,14 +51,27 @@ interface IDisputeManager { // -- Attestation -- - // Receipt content sent from indexer in response to request + /** + * @dev Receipt content sent from indexer in response to request + * @param requestCID Content ID of the request + * @param responseCID Content ID of the response + * @param subgraphDeploymentID ID of the subgraph deployment + */ struct Receipt { bytes32 requestCID; bytes32 responseCID; bytes32 subgraphDeploymentID; } - // Attestation sent from indexer in response to a request + /** + * @dev Attestation sent from indexer in response to a request + * @param requestCID Content ID of the request + * @param responseCID Content ID of the response + * @param subgraphDeploymentID ID of the subgraph deployment + * @param r R component of the signature + * @param s S component of the signature + * @param v Recovery ID of the signature + */ struct Attestation { bytes32 requestCID; bytes32 responseCID; @@ -51,41 +83,121 @@ interface IDisputeManager { // -- Configuration -- + /** + * @dev Set the arbitrator address. + * @notice Update the arbitrator to `_arbitrator` + * @param _arbitrator The address of the arbitration contract or party + */ function setArbitrator(address _arbitrator) external; + /** + * @dev Set the minimum deposit required to create a dispute. + * @notice Update the minimum deposit to `_minimumDeposit` Graph Tokens + * @param _minimumDeposit The minimum deposit in Graph Tokens + */ function setMinimumDeposit(uint256 _minimumDeposit) external; + /** + * @dev Set the percent reward that the fisherman gets when slashing occurs. + * @notice Update the reward percentage to `_percentage` + * @param _percentage Reward as a percentage of indexer stake + */ function setFishermanRewardPercentage(uint32 _percentage) external; + /** + * @notice Set the percentage used for slashing indexers. + * @param _qryPercentage Percentage slashing for query disputes + * @param _idxPercentage Percentage slashing for indexing disputes + */ function setSlashingPercentage(uint32 _qryPercentage, uint32 _idxPercentage) external; // -- Getters -- + /** + * @notice Check if a dispute has been created + * @param _disputeID Dispute identifier + * @return True if the dispute exists + */ function isDisputeCreated(bytes32 _disputeID) external view returns (bool); + /** + * @notice Encode a receipt into a hash for EIP-712 signature verification + * @param _receipt The receipt to encode + * @return The encoded hash + */ function encodeHashReceipt(Receipt memory _receipt) external view returns (bytes32); + /** + * @notice Check if two attestations are conflicting + * @param _attestation1 First attestation + * @param _attestation2 Second attestation + * @return True if attestations are conflicting + */ function areConflictingAttestations( Attestation memory _attestation1, Attestation memory _attestation2 ) external pure returns (bool); + /** + * @notice Get the indexer address from an attestation + * @param _attestation The attestation to extract indexer from + * @return The indexer address + */ function getAttestationIndexer(Attestation memory _attestation) external view returns (address); // -- Dispute -- + /** + * @notice Create a query dispute for the arbitrator to resolve. + * This function is called by a fisherman that will need to `_deposit` at + * least `minimumDeposit` GRT tokens. + * @param _attestationData Attestation bytes submitted by the fisherman + * @param _deposit Amount of tokens staked as deposit + * @return The dispute ID + */ function createQueryDispute(bytes calldata _attestationData, uint256 _deposit) external returns (bytes32); + /** + * @notice Create query disputes for two conflicting attestations. + * A conflicting attestation is a proof presented by two different indexers + * where for the same request on a subgraph the response is different. + * For this type of dispute the submitter is not required to present a deposit + * as one of the attestation is considered to be right. + * Two linked disputes will be created and if the arbitrator resolve one, the other + * one will be automatically resolved. + * @param _attestationData1 First attestation data submitted + * @param _attestationData2 Second attestation data submitted + * @return First dispute ID + * @return Second dispute ID + */ function createQueryDisputeConflict( bytes calldata _attestationData1, bytes calldata _attestationData2 ) external returns (bytes32, bytes32); + /** + * @notice Create an indexing dispute + * @param _allocationID Allocation ID being disputed + * @param _deposit Deposit amount for the dispute + * @return The dispute ID + */ function createIndexingDispute(address _allocationID, uint256 _deposit) external returns (bytes32); + /** + * @notice Accept a dispute (arbitrator only) + * @param _disputeID ID of the dispute to accept + */ function acceptDispute(bytes32 _disputeID) external; + /** + * @notice Reject a dispute (arbitrator only) + * @param _disputeID ID of the dispute to reject + */ function rejectDispute(bytes32 _disputeID) external; + /** + * @notice Draw a dispute (arbitrator only) + * @param _disputeID ID of the dispute to draw + */ function drawDispute(bytes32 _disputeID) external; } diff --git a/packages/contracts/contracts/epochs/EpochManager.sol b/packages/contracts/contracts/epochs/EpochManager.sol index 281b63896..440f3d1cb 100644 --- a/packages/contracts/contracts/epochs/EpochManager.sol +++ b/packages/contracts/contracts/epochs/EpochManager.sol @@ -2,27 +2,45 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts/math/SafeMath.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-small-strings, gas-strict-inequalities -import "../upgrades/GraphUpgradeable.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import "./EpochManagerStorage.sol"; -import "./IEpochManager.sol"; +import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; +import { Managed } from "../governance/Managed.sol"; + +import { EpochManagerV1Storage } from "./EpochManagerStorage.sol"; +import { IEpochManager } from "./IEpochManager.sol"; /** * @title EpochManager contract - * @dev Produce epochs based on a number of blocks to coordinate contracts in the protocol. + * @author Edge & Node + * @notice Produce epochs based on a number of blocks to coordinate contracts in the protocol. */ contract EpochManager is EpochManagerV1Storage, GraphUpgradeable, IEpochManager { using SafeMath for uint256; // -- Events -- + /** + * @notice Emitted when an epoch is run + * @param epoch The epoch number that was run + * @param caller Address that called runEpoch() + */ event EpochRun(uint256 indexed epoch, address caller); + + /** + * @notice Emitted when the epoch length is updated + * @param epoch The epoch when the length was updated + * @param epochLength The new epoch length in blocks + */ event EpochLengthUpdate(uint256 indexed epoch, uint256 epochLength); /** - * @dev Initialize this contract. + * @notice Initialize this contract. + * @param _controller Address of the Controller contract + * @param _epochLength Length of each epoch in blocks */ function initialize(address _controller, uint256 _epochLength) external onlyImpl { require(_epochLength > 0, "Epoch length cannot be 0"); @@ -39,9 +57,7 @@ contract EpochManager is EpochManagerV1Storage, GraphUpgradeable, IEpochManager } /** - * @dev Set the epoch length. - * @notice Set epoch length to `_epochLength` blocks - * @param _epochLength Epoch length in blocks + * @inheritdoc IEpochManager */ function setEpochLength(uint256 _epochLength) external override onlyGovernor { require(_epochLength > 0, "Epoch length cannot be 0"); @@ -55,8 +71,7 @@ contract EpochManager is EpochManagerV1Storage, GraphUpgradeable, IEpochManager } /** - * @dev Run a new epoch, should be called once at the start of any epoch. - * @notice Perform state changes for the current epoch + * @inheritdoc IEpochManager */ function runEpoch() external override { // Check if already called for the current epoch @@ -70,24 +85,21 @@ contract EpochManager is EpochManagerV1Storage, GraphUpgradeable, IEpochManager } /** - * @dev Return true if the current epoch has already run. - * @return Return true if current epoch is the last epoch that has run + * @inheritdoc IEpochManager */ function isCurrentEpochRun() public view override returns (bool) { return lastRunEpoch == currentEpoch(); } /** - * @dev Return current block number. - * @return Block number + * @inheritdoc IEpochManager */ function blockNum() public view override returns (uint256) { return block.number; } /** - * @dev Return blockhash for a block. - * @return BlockHash for `_block` number + * @inheritdoc IEpochManager */ function blockHash(uint256 _block) external view override returns (bytes32) { uint256 currentBlock = blockNum(); @@ -99,33 +111,28 @@ contract EpochManager is EpochManagerV1Storage, GraphUpgradeable, IEpochManager } /** - * @dev Return the current epoch, it may have not been run yet. - * @return The current epoch based on epoch length + * @inheritdoc IEpochManager */ function currentEpoch() public view override returns (uint256) { return lastLengthUpdateEpoch.add(epochsSinceUpdate()); } /** - * @dev Return block where the current epoch started. - * @return The block number when the current epoch started + * @inheritdoc IEpochManager */ function currentEpochBlock() public view override returns (uint256) { return lastLengthUpdateBlock.add(epochsSinceUpdate().mul(epochLength)); } /** - * @dev Return the number of blocks that passed since current epoch started. - * @return Blocks that passed since start of epoch + * @inheritdoc IEpochManager */ function currentEpochBlockSinceStart() external view override returns (uint256) { return blockNum() - currentEpochBlock(); } /** - * @dev Return the number of epoch that passed since another epoch. - * @param _epoch Epoch to use as since epoch value - * @return Number of epochs and current epoch + * @inheritdoc IEpochManager */ function epochsSince(uint256 _epoch) external view override returns (uint256) { uint256 epoch = currentEpoch(); @@ -133,8 +140,7 @@ contract EpochManager is EpochManagerV1Storage, GraphUpgradeable, IEpochManager } /** - * @dev Return number of epochs passed since last epoch length update. - * @return The number of epoch that passed since last epoch length update + * @inheritdoc IEpochManager */ function epochsSinceUpdate() public view override returns (uint256) { return blockNum().sub(lastLengthUpdateBlock).div(epochLength); diff --git a/packages/contracts/contracts/epochs/EpochManagerStorage.sol b/packages/contracts/contracts/epochs/EpochManagerStorage.sol index 5f8599434..894f34a46 100644 --- a/packages/contracts/contracts/epochs/EpochManagerStorage.sol +++ b/packages/contracts/contracts/epochs/EpochManagerStorage.sol @@ -2,18 +2,24 @@ pragma solidity ^0.7.6; -import "../governance/Managed.sol"; +import { Managed } from "../governance/Managed.sol"; +/** + * @title Epoch Manager Storage V1 + * @author Edge & Node + * @notice Storage contract for the Epoch Manager + */ contract EpochManagerV1Storage is Managed { // -- State -- - // Epoch length in blocks + /// @notice Epoch length in blocks uint256 public epochLength; - // Epoch that was last run + /// @notice Epoch that was last run uint256 public lastRunEpoch; - // Block and epoch when epoch length was last updated + /// @notice Epoch when epoch length was last updated uint256 public lastLengthUpdateEpoch; + /// @notice Block when epoch length was last updated uint256 public lastLengthUpdateBlock; } diff --git a/packages/contracts/contracts/epochs/IEpochManager.sol b/packages/contracts/contracts/epochs/IEpochManager.sol index c65280d59..24759f603 100644 --- a/packages/contracts/contracts/epochs/IEpochManager.sol +++ b/packages/contracts/contracts/epochs/IEpochManager.sol @@ -2,30 +2,77 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Epoch Manager Interface + * @author Edge & Node + * @notice Interface for the Epoch Manager contract that handles protocol epochs + */ interface IEpochManager { // -- Configuration -- + /** + * @notice Set epoch length to `_epochLength` blocks + * @param _epochLength Epoch length in blocks + */ function setEpochLength(uint256 _epochLength) external; // -- Epochs + /** + * @dev Run a new epoch, should be called once at the start of any epoch. + * @notice Perform state changes for the current epoch + */ function runEpoch() external; // -- Getters -- + /** + * @notice Check if the current epoch has been run + * @return True if current epoch has been run, false otherwise + */ function isCurrentEpochRun() external view returns (bool); + /** + * @notice Get the current block number + * @return Current block number + */ function blockNum() external view returns (uint256); + /** + * @notice Get the hash of a specific block + * @param _block Block number to get hash for + * @return Block hash + */ function blockHash(uint256 _block) external view returns (bytes32); + /** + * @notice Get the current epoch number + * @return Current epoch number + */ function currentEpoch() external view returns (uint256); + /** + * @notice Get the block number when the current epoch started + * @return Block number of current epoch start + */ function currentEpochBlock() external view returns (uint256); + /** + * @notice Get the number of blocks since the current epoch started + * @return Number of blocks since current epoch start + */ function currentEpochBlockSinceStart() external view returns (uint256); + /** + * @notice Get the number of epochs since a given epoch + * @param _epoch Epoch to calculate from + * @return Number of epochs since the given epoch + */ function epochsSince(uint256 _epoch) external view returns (uint256); + /** + * @notice Get the number of epochs since the last epoch length update + * @return Number of epochs since last update + */ function epochsSinceUpdate() external view returns (uint256); } diff --git a/packages/contracts/contracts/gateway/BridgeEscrow.sol b/packages/contracts/contracts/gateway/BridgeEscrow.sol index 73bc0a3d7..d3b50edc8 100644 --- a/packages/contracts/contracts/gateway/BridgeEscrow.sol +++ b/packages/contracts/contracts/gateway/BridgeEscrow.sol @@ -9,7 +9,8 @@ import { Managed } from "../governance/Managed.sol"; /** * @title Bridge Escrow - * @dev This contracts acts as a gateway for an L2 bridge (or several). It simply holds GRT and has + * @author Edge & Node + * @notice This contracts acts as a gateway for an L2 bridge (or several). It simply holds GRT and has * a set of spenders that can transfer the tokens; the L1 side of each L2 bridge has to be * approved as a spender. */ diff --git a/packages/contracts/contracts/gateway/GraphTokenGateway.sol b/packages/contracts/contracts/gateway/GraphTokenGateway.sol index fb992afc2..f11f52f7d 100644 --- a/packages/contracts/contracts/gateway/GraphTokenGateway.sol +++ b/packages/contracts/contracts/gateway/GraphTokenGateway.sol @@ -9,7 +9,8 @@ import { Managed } from "../governance/Managed.sol"; /** * @title L1/L2 Graph Token Gateway - * @dev This includes everything that's shared between the L1 and L2 sides of the bridge. + * @author Edge & Node + * @notice This includes everything that's shared between the L1 and L2 sides of the bridge. */ abstract contract GraphTokenGateway is GraphUpgradeable, Pausable, Managed, ITokenGateway { /// @dev Storage gap added in case we need to add state variables to this contract @@ -52,7 +53,7 @@ abstract contract GraphTokenGateway is GraphUpgradeable, Pausable, Managed, ITok } /** - * @dev Override the default pausing from Managed to allow pausing this + * @notice Override the default pausing from Managed to allow pausing this * particular contract instead of pausing from the Controller. */ function _notPaused() internal view override { @@ -60,7 +61,7 @@ abstract contract GraphTokenGateway is GraphUpgradeable, Pausable, Managed, ITok } /** - * @dev Runs state validation before unpausing, reverts if + * @notice Runs state validation before unpausing, reverts if * something is not set properly */ function _checksBeforeUnpause() internal view virtual; diff --git a/packages/contracts/contracts/gateway/ICallhookReceiver.sol b/packages/contracts/contracts/gateway/ICallhookReceiver.sol index 8d003cb76..d3b674bcc 100644 --- a/packages/contracts/contracts/gateway/ICallhookReceiver.sol +++ b/packages/contracts/contracts/gateway/ICallhookReceiver.sol @@ -2,12 +2,18 @@ /** * @title Interface for contracts that can receive callhooks through the Arbitrum GRT bridge - * @dev Any contract that can receive a callhook on L2, sent through the bridge from L1, must + * @author Edge & Node + * @notice Any contract that can receive a callhook on L2, sent through the bridge from L1, must * be allowlisted by the governor, but also implement this interface that contains * the function that will actually be called by the L2GraphTokenGateway. */ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Callhook Receiver Interface + * @author Edge & Node + * @notice Interface for contracts that can receive tokens with callhook from the bridge + */ interface ICallhookReceiver { /** * @notice Receive tokens with a callhook from the bridge diff --git a/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol b/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol index 7fad927ad..20c25d2e6 100644 --- a/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol +++ b/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol @@ -3,6 +3,10 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-strict-inequalities +// solhint-disable named-parameters-mapping + import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import { SafeMathUpgradeable } from "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; @@ -18,7 +22,8 @@ import { IGraphToken } from "../token/IGraphToken.sol"; /** * @title L1 Graph Token Gateway Contract - * @dev Provides the L1 side of the Ethereum-Arbitrum GRT bridge. Sends GRT to the L2 chain + * @author Edge & Node + * @notice Provides the L1 side of the Ethereum-Arbitrum GRT bridge. Sends GRT to the L2 chain * by escrowing them and sending a message to the L2 gateway, and receives tokens from L2 by * releasing them from escrow. * Based on Offchain Labs' reference implementation and Livepeer's arbitrum-lpt-bridge @@ -28,28 +33,35 @@ import { IGraphToken } from "../token/IGraphToken.sol"; contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMessenger { using SafeMathUpgradeable for uint256; - /// Address of the Graph Token contract on L2 + /// @notice Address of the Graph Token contract on L2 address public l2GRT; - /// Address of the Arbitrum Inbox + /// @notice Address of the Arbitrum Inbox address public inbox; - /// Address of the Arbitrum Gateway Router on L1 + /// @notice Address of the Arbitrum Gateway Router on L1 address public l1Router; - /// Address of the L2GraphTokenGateway on L2 that is the counterpart of this gateway + /// @notice Address of the L2GraphTokenGateway on L2 that is the counterpart of this gateway address public l2Counterpart; - /// Address of the BridgeEscrow contract that holds the GRT in the bridge + /// @notice Address of the BridgeEscrow contract that holds the GRT in the bridge address public escrow; - /// Addresses for which this mapping is true are allowed to send callhooks in outbound transfers + /// @notice Addresses for which this mapping is true are allowed to send callhooks in outbound transfers mapping(address => bool) public callhookAllowlist; - /// Total amount minted from L2 + /// @notice Total amount minted from L2 uint256 public totalMintedFromL2; - /// Accumulated allowance for tokens minted from L2 at lastL2MintAllowanceUpdateBlock + /// @notice Accumulated allowance for tokens minted from L2 at lastL2MintAllowanceUpdateBlock uint256 public accumulatedL2MintAllowanceSnapshot; - /// Block at which new L2 allowance starts accumulating + /// @notice Block at which new L2 allowance starts accumulating uint256 public lastL2MintAllowanceUpdateBlock; - /// New L2 mint allowance per block + /// @notice New L2 mint allowance per block uint256 public l2MintAllowancePerBlock; - /// Emitted when an outbound transfer is initiated, i.e. tokens are deposited from L1 to L2 + /** + * @notice Emitted when an outbound transfer is initiated, i.e. tokens are deposited from L1 to L2 + * @param l1Token Address of the L1 token being transferred + * @param from Address sending the tokens on L1 + * @param to Address receiving the tokens on L2 + * @param sequenceNumber Sequence number of the retryable ticket + * @param amount Amount of tokens transferred + */ event DepositInitiated( address l1Token, address indexed from, @@ -58,7 +70,14 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess uint256 amount ); - /// Emitted when an incoming transfer is finalized, i.e tokens are withdrawn from L2 to L1 + /** + * @notice Emitted when an incoming transfer is finalized, i.e tokens are withdrawn from L2 to L1 + * @param l1Token Address of the L1 token being transferred + * @param from Address sending the tokens on L2 + * @param to Address receiving the tokens on L1 + * @param exitNum Exit number (always 0 for this contract) + * @param amount Amount of tokens transferred + */ event WithdrawalFinalized( address l1Token, address indexed from, @@ -67,25 +86,58 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess uint256 amount ); - /// Emitted when the Arbitrum Inbox and Gateway Router addresses have been updated + /** + * @notice Emitted when the Arbitrum Inbox and Gateway Router addresses have been updated + * @param inbox Address of the Arbitrum Inbox + * @param l1Router Address of the L1 Gateway Router + */ event ArbitrumAddressesSet(address inbox, address l1Router); - /// Emitted when the L2 GRT address has been updated + + /** + * @notice Emitted when the L2 GRT address has been updated + * @param l2GRT Address of the L2 GRT contract + */ event L2TokenAddressSet(address l2GRT); - /// Emitted when the counterpart L2GraphTokenGateway address has been updated + + /** + * @notice Emitted when the counterpart L2GraphTokenGateway address has been updated + * @param l2Counterpart Address of the L2 counterpart gateway + */ event L2CounterpartAddressSet(address l2Counterpart); - /// Emitted when the escrow address has been updated + /** + * @notice Emitted when the escrow address has been updated + * @param escrow Address of the escrow contract + */ event EscrowAddressSet(address escrow); - /// Emitted when an address is added to the callhook allowlist + + /** + * @notice Emitted when an address is added to the callhook allowlist + * @param newAllowlisted Address added to the allowlist + */ event AddedToCallhookAllowlist(address newAllowlisted); - /// Emitted when an address is removed from the callhook allowlist + + /** + * @notice Emitted when an address is removed from the callhook allowlist + * @param notAllowlisted Address removed from the allowlist + */ event RemovedFromCallhookAllowlist(address notAllowlisted); - /// Emitted when the L2 mint allowance per block is updated + + /** + * @notice Emitted when the L2 mint allowance per block is updated + * @param accumulatedL2MintAllowanceSnapshot Accumulated allowance snapshot at update block + * @param l2MintAllowancePerBlock New allowance per block + * @param lastL2MintAllowanceUpdateBlock Block number when allowance was updated + */ event L2MintAllowanceUpdated( uint256 accumulatedL2MintAllowanceSnapshot, uint256 l2MintAllowancePerBlock, uint256 lastL2MintAllowanceUpdateBlock ); - /// Emitted when tokens are minted due to an incoming transfer from L2 + + /** + * @notice Emitted when tokens are minted due to an incoming transfer from L2 + * @param amount Amount of tokens minted + */ event TokensMintedFromL2(uint256 amount); /** @@ -199,7 +251,7 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @dev Updates the L2 mint allowance per block + * @notice Updates the L2 mint allowance per block * It is meant to be called _after_ the issuancePerBlock is updated in L2. * The caller should provide the new issuance per block and the block at which it was updated, * the function will automatically compute the values so that the bridge's mint allowance @@ -221,7 +273,7 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @dev Manually sets the parameters used to compute the L2 mint allowance + * @notice Manually sets the parameters used to compute the L2 mint allowance * The use of this function is not recommended, use updateL2MintAllowance instead; * this one is only meant to be used as a backup recovery if a previous call to * updateL2MintAllowance was done with incorrect values. @@ -246,10 +298,7 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @notice Creates and sends a retryable ticket to transfer GRT to L2 using the Arbitrum Inbox. - * The tokens are escrowed by the gateway until they are withdrawn back to L1. - * The ticket must be redeemed on L2 to receive tokens at the specified address. - * Note that the caller must previously allow the gateway to spend the specified amount of GRT. + * @inheritdoc ITokenGateway * @dev maxGas and gasPriceBid must be set using Arbitrum's NodeInterface.estimateRetryableTicket method. * Also note that allowlisted senders (some protocol contracts) can include additional calldata * for a callhook to be executed on the L2 side when the tokens are received. In this case, the L2 transaction @@ -257,13 +306,6 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess * never succeeds. This requires extra care when adding contracts to the allowlist, but is necessary to ensure that * the tickets can be retried in the case of a temporary failure, and to ensure the atomicity of callhooks * with token transfers. - * @param _l1Token L1 Address of the GRT contract (needed for compatibility with Arbitrum Gateway Router) - * @param _to Recipient address on L2 - * @param _amount Amount of tokens to transfer - * @param _maxGas Gas limit for L2 execution of the ticket - * @param _gasPriceBid Price per gas on L2 - * @param _data Encoded maxSubmissionCost and sender address along with additional calldata - * @return Sequence number of the retryable ticket created by Inbox */ function outboundTransfer( address _l1Token, @@ -304,15 +346,10 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @notice Receives withdrawn tokens from L2 - * The equivalent tokens are released from escrow and sent to the destination. + * @inheritdoc ITokenGateway * @dev can only accept transactions coming from the L2 GRT Gateway. * The last parameter is unused but kept for compatibility with Arbitrum gateways, * and the encoded exitNum is assumed to be 0. - * @param _l1Token L1 Address of the GRT contract (needed for compatibility with Arbitrum Gateway Router) - * @param _from Address of the sender - * @param _to Recipient address on L1 - * @param _amount Amount of tokens transferred */ function finalizeInboundTransfer( address _l1Token, @@ -335,10 +372,8 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @notice Calculate the L2 address of a bridged token + * @inheritdoc ITokenGateway * @dev In our case, this would only work for GRT. - * @param _l1ERC20 address of L1 GRT contract - * @return L2 address of the bridged GRT token */ function calculateL2TokenAddress(address _l1ERC20) external view override returns (address) { IGraphToken token = graphToken(); @@ -387,10 +422,8 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess ); } - /** - * @dev Runs state validation before unpausing, reverts if - * something is not set properly - */ + /// @inheritdoc GraphTokenGateway + // solhint-disable-next-line use-natspec function _checksBeforeUnpause() internal view override { require(inbox != address(0), "INBOX_NOT_SET"); require(l1Router != address(0), "ROUTER_NOT_SET"); @@ -425,7 +458,7 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @dev Get the accumulated L2 mint allowance at a particular block number + * @notice Get the accumulated L2 mint allowance at a particular block number * @param _blockNum Block at which allowance will be computed * @return The accumulated GRT amount that can be minted from L2 at the specified block */ @@ -438,7 +471,7 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @dev Mint new L1 tokens coming from L2 + * @notice Mint new L1 tokens coming from L2 * This will check if the amount to mint is within the L2's mint allowance, and revert otherwise. * The tokens will be sent to the bridge escrow (from where they will then be sent to the destinatary * of the current inbound transfer). @@ -454,7 +487,7 @@ contract L1GraphTokenGateway is Initializable, GraphTokenGateway, L1ArbitrumMess } /** - * @dev Check if minting a certain amount of tokens from L2 is within allowance + * @notice Check if minting a certain amount of tokens from L2 is within allowance * @param _amount Number of tokens that would be minted * @return true if minting those tokens is allowed, or false if it would be over allowance */ diff --git a/packages/contracts/contracts/governance/Controller.sol b/packages/contracts/contracts/governance/Controller.sol index 707a27fff..3bd3c77cb 100644 --- a/packages/contracts/contracts/governance/Controller.sol +++ b/packages/contracts/contracts/governance/Controller.sol @@ -2,6 +2,12 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-small-strings +// solhint-disable named-parameters-mapping + +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + import { IController } from "./IController.sol"; import { IManaged } from "./IManaged.sol"; import { Governed } from "./Governed.sol"; @@ -9,14 +15,19 @@ import { Pausable } from "./Pausable.sol"; /** * @title Graph Controller contract - * @dev Controller is a registry of contracts for convenience. Inspired by Livepeer: + * @author Edge & Node + * @notice Controller is a registry of contracts for convenience. Inspired by Livepeer: * https://github.com/livepeer/protocol/blob/streamflow/contracts/Controller.sol */ contract Controller is Governed, Pausable, IController { /// @dev Track contract ids to contract proxy address mapping(bytes32 => address) private _registry; - /// Emitted when the proxy address for a protocol contract has been set + /** + * @notice Emitted when the proxy address for a protocol contract has been set + * @param id Contract identifier + * @param contractAddress Address of the contract proxy + */ event SetContractProxy(bytes32 indexed id, address contractAddress); /** @@ -37,7 +48,7 @@ contract Controller is Governed, Pausable, IController { } /** - * @notice Getter to access governor + * @inheritdoc IController */ function getGovernor() external view override returns (address) { return governor; @@ -46,9 +57,7 @@ contract Controller is Governed, Pausable, IController { // -- Registry -- /** - * @notice Register contract id and mapped address - * @param _id Contract id (keccak256 hash of contract name) - * @param _contractAddress Contract address + * @inheritdoc IController */ function setContractProxy(bytes32 _id, address _contractAddress) external override onlyGovernor { require(_contractAddress != address(0), "Contract address must be set"); @@ -57,8 +66,7 @@ contract Controller is Governed, Pausable, IController { } /** - * @notice Unregister a contract address - * @param _id Contract id (keccak256 hash of contract name) + * @inheritdoc IController */ function unsetContractProxy(bytes32 _id) external override onlyGovernor { _registry[_id] = address(0); @@ -66,18 +74,14 @@ contract Controller is Governed, Pausable, IController { } /** - * @notice Get contract proxy address by its id - * @param _id Contract id - * @return Address of the proxy contract for the provided id + * @inheritdoc IController */ function getContractProxy(bytes32 _id) external view override returns (address) { return _registry[_id]; } /** - * @notice Update contract's controller - * @param _id Contract id (keccak256 hash of contract name) - * @param _controller Controller address + * @inheritdoc IController */ function updateController(bytes32 _id, address _controller) external override onlyGovernor { require(_controller != address(0), "Controller must be set"); @@ -96,17 +100,15 @@ contract Controller is Governed, Pausable, IController { } /** - * @notice Change the paused state of the contract - * Full pause most of protocol functions - * @param _toPause True if the contracts should be paused, false otherwise + * @inheritdoc IController + * @dev Full pause most of protocol functions */ function setPaused(bool _toPause) external override onlyGovernorOrGuardian { _setPaused(_toPause); } /** - * @notice Change the Pause Guardian - * @param _newPauseGuardian The address of the new Pause Guardian + * @inheritdoc IController */ function setPauseGuardian(address _newPauseGuardian) external override onlyGovernor { require(_newPauseGuardian != address(0), "PauseGuardian must be set"); @@ -114,16 +116,14 @@ contract Controller is Governed, Pausable, IController { } /** - * @notice Getter to access paused - * @return True if the contracts are paused, false otherwise + * @inheritdoc IController */ function paused() external view override returns (bool) { return _paused; } /** - * @notice Getter to access partial pause status - * @return True if the contracts are partially paused, false otherwise + * @inheritdoc IController */ function partialPaused() external view override returns (bool) { return _partialPaused; diff --git a/packages/contracts/contracts/governance/Governed.sol b/packages/contracts/contracts/governance/Governed.sol index 76a3247dd..8c3446b88 100644 --- a/packages/contracts/contracts/governance/Governed.sol +++ b/packages/contracts/contracts/governance/Governed.sol @@ -2,23 +2,39 @@ pragma solidity ^0.7.6 || 0.8.27; +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + /** * @title Graph Governance contract - * @dev All contracts that will be owned by a Governor entity should extend this contract. + * @author Edge & Node + * @notice All contracts that will be owned by a Governor entity should extend this contract. */ abstract contract Governed { // -- State -- - /// Address of the governor + /** + * @notice Address of the governor + */ address public governor; - /// Address of the new governor that is pending acceptance + /** + * @notice Address of the new governor that is pending acceptance + */ address public pendingGovernor; // -- Events -- - /// Emitted when a new owner/governor has been set, but is pending acceptance + /** + * @notice Emitted when a new owner/governor has been set, but is pending acceptance + * @param from Previous pending governor address + * @param to New pending governor address + */ event NewPendingOwnership(address indexed from, address indexed to); - /// Emitted when a new owner/governor has accepted their role + + /** + * @notice Emitted when a new owner/governor has accepted their role + * @param from Previous governor address + * @param to New governor address + */ event NewOwnership(address indexed from, address indexed to); /** @@ -30,7 +46,7 @@ abstract contract Governed { } /** - * @dev Initialize the governor for this contract + * @notice Initialize the governor for this contract * @param _initGovernor Address of the governor */ function _initialize(address _initGovernor) internal { diff --git a/packages/contracts/contracts/governance/IController.sol b/packages/contracts/contracts/governance/IController.sol index 6ab72010e..af1c43a0e 100644 --- a/packages/contracts/contracts/governance/IController.sol +++ b/packages/contracts/contracts/governance/IController.sol @@ -2,28 +2,78 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Controller Interface + * @author Edge & Node + * @notice Interface for the Controller contract that manages protocol governance and contract registry + */ interface IController { + /** + * @notice Return the governor address + * @return The governor address + */ function getGovernor() external view returns (address); // -- Registry -- + /** + * @notice Register contract id and mapped address + * @param _id Contract id (keccak256 hash of contract name) + * @param _contractAddress Contract address + */ function setContractProxy(bytes32 _id, address _contractAddress) external; + /** + * @notice Unregister a contract address + * @param _id Contract id (keccak256 hash of contract name) + */ function unsetContractProxy(bytes32 _id) external; + /** + * @notice Update contract's controller + * @param _id Contract id (keccak256 hash of contract name) + * @param _controller Controller address + */ function updateController(bytes32 _id, address _controller) external; + /** + * @notice Get contract proxy address by its id + * @param _id Contract id + * @return Address of the proxy contract for the provided id + */ function getContractProxy(bytes32 _id) external view returns (address); // -- Pausing -- + /** + * @notice Change the partial paused state of the contract + * Partial pause is intended as a partial pause of the protocol + * @param _partialPaused True if the contracts should be (partially) paused, false otherwise + */ function setPartialPaused(bool _partialPaused) external; + /** + * @notice Change the paused state of the contract + * Full pause most of protocol functions + * @param _paused True if the contracts should be paused, false otherwise + */ function setPaused(bool _paused) external; + /** + * @notice Change the Pause Guardian + * @param _newPauseGuardian The address of the new Pause Guardian + */ function setPauseGuardian(address _newPauseGuardian) external; + /** + * @notice Return whether the protocol is paused + * @return True if the protocol is paused + */ function paused() external view returns (bool); + /** + * @notice Return whether the protocol is partially paused + * @return True if the protocol is partially paused + */ function partialPaused() external view returns (bool); } diff --git a/packages/contracts/contracts/governance/IManaged.sol b/packages/contracts/contracts/governance/IManaged.sol index ff6625d81..8bfe2ae0b 100644 --- a/packages/contracts/contracts/governance/IManaged.sol +++ b/packages/contracts/contracts/governance/IManaged.sol @@ -6,21 +6,21 @@ import { IController } from "./IController.sol"; /** * @title Managed Interface - * @dev Interface for contracts that can be managed by a controller. + * @author Edge & Node + * @notice Interface for contracts that can be managed by a controller. */ interface IManaged { /** - * @notice Set the controller that manages this contract - * @dev Only the current controller can set a new controller - * @param _controller Address of the new controller + * @notice Set Controller. Only callable by current controller. + * @param _controller Controller contract address */ function setController(address _controller) external; /** * @notice Sync protocol contract addresses from the Controller registry - * @dev This function will cache all the contracts using the latest addresses. + * @dev This function will cache all the contracts using the latest addresses * Anyone can call the function whenever a Proxy contract change in the - * controller to ensure the protocol is using the latest version. + * controller to ensure the protocol is using the latest version */ function syncAllContracts() external; diff --git a/packages/contracts/contracts/governance/Managed.sol b/packages/contracts/contracts/governance/Managed.sol index 9b0ea29c8..596dee0f7 100644 --- a/packages/contracts/contracts/governance/Managed.sol +++ b/packages/contracts/contracts/governance/Managed.sol @@ -2,11 +2,15 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events +// solhint-disable named-parameters-mapping + import { IController } from "./IController.sol"; import { ICuration } from "../curation/ICuration.sol"; import { IEpochManager } from "../epochs/IEpochManager.sol"; -import { IRewardsManager } from "../rewards/IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; import { IStaking } from "../staking/IStaking.sol"; import { IGraphToken } from "../token/IGraphToken.sol"; import { ITokenGateway } from "../arbitrum/ITokenGateway.sol"; @@ -16,7 +20,8 @@ import { IManaged } from "./IManaged.sol"; /** * @title Graph Managed contract - * @dev The Managed contract provides an interface to interact with the Controller. + * @author Edge & Node + * @notice The Managed contract provides an interface to interact with the Controller. * It also provides local caching for contract addresses. This mechanism relies on calling the * public `syncAllContracts()` function whenever a contract changes in the controller. * @@ -26,7 +31,9 @@ import { IManaged } from "./IManaged.sol"; abstract contract Managed is IManaged { // -- State -- - /// Controller that manages this contract + /** + * @inheritdoc IManaged + */ IController public override controller; /// @dev Cache for the addresses of the contracts retrieved from the controller mapping(bytes32 => address) private _addressCache; @@ -34,28 +41,46 @@ abstract contract Managed is IManaged { uint256[10] private __gap; // Immutables + /// @dev Contract name hash for Curation contract bytes32 private immutable CURATION = keccak256("Curation"); + /// @dev Contract name hash for EpochManager contract bytes32 private immutable EPOCH_MANAGER = keccak256("EpochManager"); + /// @dev Contract name hash for RewardsManager contract bytes32 private immutable REWARDS_MANAGER = keccak256("RewardsManager"); + /// @dev Contract name hash for Staking contract bytes32 private immutable STAKING = keccak256("Staking"); + /// @dev Contract name hash for GraphToken contract bytes32 private immutable GRAPH_TOKEN = keccak256("GraphToken"); + /// @dev Contract name hash for GraphTokenGateway contract bytes32 private immutable GRAPH_TOKEN_GATEWAY = keccak256("GraphTokenGateway"); + /// @dev Contract name hash for GNS contract bytes32 private immutable GNS = keccak256("GNS"); // -- Events -- - /// Emitted when a contract parameter has been updated + /** + * @notice Emitted when a contract parameter has been updated + * @param param Name of the parameter that was updated + */ event ParameterUpdated(string param); - /// Emitted when the controller address has been set + + /** + * @notice Emitted when the controller address has been set + * @param controller Address of the new controller + */ event SetController(address controller); - /// Emitted when contract with `nameHash` is synced to `contractAddress`. + /** + * @notice Emitted when contract with `nameHash` is synced to `contractAddress`. + * @param nameHash Hash of the contract name + * @param contractAddress Address of the synced contract + */ event ContractSynced(bytes32 indexed nameHash, address contractAddress); // -- Modifiers -- /** - * @dev Revert if the controller is paused or partially paused + * @notice Revert if the controller is paused or partially paused */ function _notPartialPaused() internal view { require(!controller.paused(), "Paused"); @@ -63,21 +88,21 @@ abstract contract Managed is IManaged { } /** - * @dev Revert if the controller is paused + * @notice Revert if the controller is paused */ function _notPaused() internal view virtual { require(!controller.paused(), "Paused"); } /** - * @dev Revert if the caller is not the governor + * @notice Revert if the caller is not the governor */ function _onlyGovernor() internal view { require(msg.sender == controller.getGovernor(), "Only Controller governor"); } /** - * @dev Revert if the caller is not the Controller + * @notice Revert if the caller is not the Controller */ function _onlyController() internal view { require(msg.sender == address(controller), "Caller must be Controller"); @@ -118,7 +143,7 @@ abstract contract Managed is IManaged { // -- Functions -- /** - * @dev Initialize a Managed contract + * @notice Initialize a Managed contract * @param _controller Address for the Controller that manages this contract */ function _initialize(address _controller) internal { @@ -126,15 +151,14 @@ abstract contract Managed is IManaged { } /** - * @notice Set Controller. Only callable by current controller. - * @param _controller Controller contract address + * @inheritdoc IManaged */ function setController(address _controller) external override onlyController { _setController(_controller); } /** - * @dev Set controller. + * @notice Set controller. * @param _controller Controller contract address */ function _setController(address _controller) internal { @@ -144,7 +168,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return Curation interface + * @notice Return Curation interface * @return Curation contract registered with Controller */ function curation() internal view returns (ICuration) { @@ -152,7 +176,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return EpochManager interface + * @notice Return EpochManager interface * @return Epoch manager contract registered with Controller */ function epochManager() internal view returns (IEpochManager) { @@ -160,7 +184,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return RewardsManager interface + * @notice Return RewardsManager interface * @return Rewards manager contract registered with Controller */ function rewardsManager() internal view returns (IRewardsManager) { @@ -168,7 +192,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return Staking interface + * @notice Return Staking interface * @return Staking contract registered with Controller */ function staking() internal view returns (IStaking) { @@ -176,7 +200,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return GraphToken interface + * @notice Return GraphToken interface * @return Graph token contract registered with Controller */ function graphToken() internal view returns (IGraphToken) { @@ -184,7 +208,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return GraphTokenGateway (L1 or L2) interface + * @notice Return GraphTokenGateway (L1 or L2) interface * @return Graph token gateway contract registered with Controller */ function graphTokenGateway() internal view returns (ITokenGateway) { @@ -192,7 +216,7 @@ abstract contract Managed is IManaged { } /** - * @dev Return GNS (L1 or L2) interface. + * @notice Return GNS (L1 or L2) interface. * @return Address of the GNS contract registered with Controller, as an IGNS interface. */ function gns() internal view returns (IGNS) { @@ -200,7 +224,7 @@ abstract contract Managed is IManaged { } /** - * @dev Resolve a contract address from the cache or the Controller if not found. + * @notice Resolve a contract address from the cache or the Controller if not found. * @param _nameHash keccak256 hash of the contract name * @return Address of the contract */ @@ -213,7 +237,7 @@ abstract contract Managed is IManaged { } /** - * @dev Cache a contract address from the Controller registry. + * @notice Cache a contract address from the Controller registry. * @param _nameHash keccak256 hash of the name of the contract to sync into the cache */ function _syncContract(bytes32 _nameHash) internal { @@ -225,10 +249,7 @@ abstract contract Managed is IManaged { } /** - * @notice Sync protocol contract addresses from the Controller registry - * @dev This function will cache all the contracts using the latest addresses - * Anyone can call the function whenever a Proxy contract change in the - * controller to ensure the protocol is using the latest version + * @inheritdoc IManaged */ function syncAllContracts() external override { _syncContract(CURATION); diff --git a/packages/contracts/contracts/governance/Pausable.sol b/packages/contracts/contracts/governance/Pausable.sol index 2bc1795cd..bf260cb72 100644 --- a/packages/contracts/contracts/governance/Pausable.sol +++ b/packages/contracts/contracts/governance/Pausable.sol @@ -2,6 +2,14 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + +/** + * @title Pausable Contract + * @author Edge & Node + * @notice Abstract contract that provides pause functionality for protocol operations + */ abstract contract Pausable { /** * @dev "Partial paused" pauses exit and enter functions for GRT, but not internal @@ -13,24 +21,36 @@ abstract contract Pausable { */ bool internal _paused; - /// Timestamp for the last time the partial pause was set + /// @notice Timestamp for the last time the partial pause was set uint256 public lastPartialPauseTime; - /// Timestamp for the last time the full pause was set + /// @notice Timestamp for the last time the full pause was set uint256 public lastPauseTime; - /// Pause guardian is a separate entity from the governor that can + /// @notice Pause guardian is a separate entity from the governor that can /// pause and unpause the protocol, fully or partially address public pauseGuardian; - /// Emitted when the partial pause state changed + /** + * @notice Emitted when the partial pause state changed + * @param isPaused Whether the contract is partially paused + */ event PartialPauseChanged(bool isPaused); - /// Emitted when the full pause state changed + + /** + * @notice Emitted when the full pause state changed + * @param isPaused Whether the contract is fully paused + */ event PauseChanged(bool isPaused); - /// Emitted when the pause guardian is changed + + /** + * @notice Emitted when the pause guardian is changed + * @param oldPauseGuardian Address of the previous pause guardian + * @param pauseGuardian Address of the new pause guardian + */ event NewPauseGuardian(address indexed oldPauseGuardian, address indexed pauseGuardian); /** - * @dev Change the partial paused state of the contract + * @notice Change the partial paused state of the contract * @param _toPartialPause New value for the partial pause state (true means the contracts will be partially paused) */ function _setPartialPaused(bool _toPartialPause) internal { @@ -45,7 +65,7 @@ abstract contract Pausable { } /** - * @dev Change the paused state of the contract + * @notice Change the paused state of the contract * @param _toPause New value for the pause state (true means the contracts will be paused) */ function _setPaused(bool _toPause) internal { @@ -60,7 +80,7 @@ abstract contract Pausable { } /** - * @dev Change the Pause Guardian + * @notice Change the Pause Guardian * @param newPauseGuardian The address of the new Pause Guardian */ function _setPauseGuardian(address newPauseGuardian) internal { diff --git a/packages/contracts/contracts/l2/curation/IL2Curation.sol b/packages/contracts/contracts/l2/curation/IL2Curation.sol index 7f93f9603..3b39ac7a6 100644 --- a/packages/contracts/contracts/l2/curation/IL2Curation.sol +++ b/packages/contracts/contracts/l2/curation/IL2Curation.sol @@ -4,6 +4,8 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Interface of the L2 Curation contract. + * @author Edge & Node + * @notice Interface for the L2 Curation contract that handles curation on Layer 2 */ interface IL2Curation { /** diff --git a/packages/contracts/contracts/l2/curation/L2Curation.sol b/packages/contracts/contracts/l2/curation/L2Curation.sol index 271545ea7..9a5f6a4e6 100644 --- a/packages/contracts/contracts/l2/curation/L2Curation.sol +++ b/packages/contracts/contracts/l2/curation/L2Curation.sol @@ -3,13 +3,16 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-small-strings, gas-strict-inequalities + import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import { SafeMathUpgradeable } from "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import { ClonesUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/ClonesUpgradeable.sol"; import { GraphUpgradeable } from "../../upgrades/GraphUpgradeable.sol"; import { TokenUtils } from "../../utils/TokenUtils.sol"; -import { IRewardsManager } from "../../rewards/IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; import { Managed } from "../../governance/Managed.sol"; import { IGraphToken } from "../../token/IGraphToken.sol"; import { CurationV3Storage } from "../../curation/CurationStorage.sol"; @@ -18,7 +21,8 @@ import { IL2Curation } from "./IL2Curation.sol"; /** * @title L2Curation contract - * @dev Allows curators to signal on subgraph deployments that might be relevant to indexers by + * @author Edge & Node + * @notice Allows curators to signal on subgraph deployments that might be relevant to indexers by * staking Graph Tokens (GRT). Additionally, curators earn fees from the Query Market related to the * subgraph deployment they curate. * A curators deposit goes to a curation pool along with the deposits of other curators, @@ -38,14 +42,20 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { uint256 private constant SIGNAL_PER_MINIMUM_DEPOSIT = 1; // 1e-18 signal as 18 decimal number /// @dev Reserve ratio for all subgraphs set to 100% for a flat bonding curve + // solhint-disable-next-line immutable-vars-naming uint32 private immutable fixedReserveRatio = MAX_PPM; // -- Events -- /** - * @dev Emitted when `curator` deposited `tokens` on `subgraphDeploymentID` as curation signal. + * @notice Emitted when `curator` deposited `tokens` on `subgraphDeploymentID` as curation signal. * The `curator` receives `signal` amount according to the curation pool bonding curve. * An amount of `curationTax` will be collected and burned. + * @param curator Address of the curator + * @param subgraphDeploymentID Subgraph deployment being signaled on + * @param tokens Amount of tokens deposited + * @param signal Amount of signal minted + * @param curationTax Amount of tokens burned as curation tax */ event Signalled( address indexed curator, @@ -56,19 +66,26 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { ); /** - * @dev Emitted when `curator` burned `signal` for a `subgraphDeploymentID`. + * @notice Emitted when `curator` burned `signal` for a `subgraphDeploymentID`. * The curator will receive `tokens` according to the value of the bonding curve. + * @param curator Address of the curator + * @param subgraphDeploymentID Subgraph deployment being signaled on + * @param tokens Amount of tokens received + * @param signal Amount of signal burned */ event Burned(address indexed curator, bytes32 indexed subgraphDeploymentID, uint256 tokens, uint256 signal); /** - * @dev Emitted when `tokens` amount were collected for `subgraphDeploymentID` as part of fees + * @notice Emitted when `tokens` amount were collected for `subgraphDeploymentID` as part of fees * distributed by an indexer from query fees received from state channels. + * @param subgraphDeploymentID Subgraph deployment that collected fees + * @param tokens Amount of tokens collected as fees */ event Collected(bytes32 indexed subgraphDeploymentID, uint256 tokens); /** - * @dev Emitted when the subgraph service is set. + * @notice Emitted when the subgraph service is set + * @param newSubgraphService Address of the new subgraph service */ event SubgraphServiceSet(address indexed newSubgraphService); @@ -107,7 +124,8 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { * @notice Set the default reserve ratio - not implemented in L2 * @dev We only keep this for compatibility with ICuration */ - function setDefaultReserveRatio(uint32) external view override onlyGovernor { + // solhint-disable-next-line use-natspec + function setDefaultReserveRatio(uint32 /* _defaultReserveRatio */) external view override onlyGovernor { revert("Not implemented in L2"); } @@ -153,7 +171,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { * @param _tokens Amount of Graph Tokens to add to reserves */ function collect(bytes32 _subgraphDeploymentID, uint256 _tokens) external override { - // Only SubgraphService or Staking contract are authorized as caller + // Only SubgraphService and Staking contract are authorized as callers require( msg.sender == subgraphService || msg.sender == address(staking()), "Caller must be the subgraph service or staking contract" @@ -174,7 +192,8 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { * @param _subgraphDeploymentID Subgraph deployment pool from where to mint signal * @param _tokensIn Amount of Graph Tokens to deposit * @param _signalOutMin Expected minimum amount of signal to receive - * @return Signal minted and deposit tax + * @return Signal minted + * @return Curation tax paid */ function mint( bytes32 _subgraphDeploymentID, @@ -228,12 +247,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @notice Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool. - * @dev This function charges no tax and can only be called by GNS in specific scenarios (for now - * only during an L1-L2 transfer). - * @param _subgraphDeploymentID Subgraph deployment pool from where to mint signal - * @param _tokensIn Amount of Graph Tokens to deposit - * @return Signal minted + * @inheritdoc IL2Curation */ function mintTaxFree( bytes32 _subgraphDeploymentID, @@ -387,11 +401,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @notice Calculate amount of signal that can be bought with tokens in a curation pool, - * without accounting for curation tax. - * @param _subgraphDeploymentID Subgraph deployment to mint signal - * @param _tokensIn Amount of tokens used to mint signal - * @return Amount of signal that can be bought + * @inheritdoc IL2Curation */ function tokensToSignalNoTax( bytes32 _subgraphDeploymentID, @@ -401,12 +411,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @notice Calculate the amount of tokens that would be recovered if minting signal with - * the input tokens and then burning it. This can be used to compute rounding error. - * This function does not account for curation tax. - * @param _subgraphDeploymentID Subgraph deployment for which to mint signal - * @param _tokensIn Amount of tokens used to mint signal - * @return Amount of tokens that would be recovered after minting and burning signal + * @inheritdoc IL2Curation */ function tokensToSignalToTokensNoTax( bytes32 _subgraphDeploymentID, @@ -436,7 +441,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @dev Internal: Set the minimum deposit amount for curators. + * @notice Internal: Set the minimum deposit amount for curators. * Update the minimum deposit amount to `_minimumCurationDeposit` * @param _minimumCurationDeposit Minimum amount of tokens required deposit */ @@ -448,7 +453,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @dev Internal: Set the curation tax percentage to charge when a curator deposits GRT tokens. + * @notice Internal: Set the curation tax percentage to charge when a curator deposits GRT tokens. * @param _percentage Curation tax percentage charged when depositing GRT tokens */ function _setCurationTaxPercentage(uint32 _percentage) private { @@ -459,7 +464,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @dev Internal: Set the master copy to use as clones for the curation token. + * @notice Internal: Set the master copy to use as clones for the curation token. * @param _curationTokenMaster Address of implementation contract to use for curation tokens */ function _setCurationTokenMaster(address _curationTokenMaster) private { @@ -471,7 +476,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @dev Triggers an update of rewards due to a change in signal. + * @notice Triggers an update of rewards due to a change in signal. * @param _subgraphDeploymentID Subgraph deployment updated */ function _updateRewards(bytes32 _subgraphDeploymentID) private { @@ -482,7 +487,7 @@ contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { } /** - * @dev Calculate amount of signal that can be bought with tokens in a curation pool. + * @notice Calculate amount of signal that can be bought with tokens in a curation pool. * @param _subgraphDeploymentID Subgraph deployment to mint signal * @param _tokensIn Amount of tokens used to mint signal * @return Amount of signal that can be bought with tokens diff --git a/packages/contracts/contracts/l2/discovery/IL2GNS.sol b/packages/contracts/contracts/l2/discovery/IL2GNS.sol index a24216fbb..9b3a26152 100644 --- a/packages/contracts/contracts/l2/discovery/IL2GNS.sol +++ b/packages/contracts/contracts/l2/discovery/IL2GNS.sol @@ -6,8 +6,15 @@ import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; /** * @title Interface for the L2GNS contract. + * @author Edge & Node + * @notice Interface for the L2 Graph Name System (GNS) contract */ interface IL2GNS is ICallhookReceiver { + /** + * @dev Message codes for L1 to L2 communication + * @param RECEIVE_SUBGRAPH_CODE Code for receiving subgraph transfers + * @param RECEIVE_CURATOR_BALANCE_CODE Code for receiving curator balance transfers + */ enum L1MessageCodes { RECEIVE_SUBGRAPH_CODE, RECEIVE_CURATOR_BALANCE_CODE @@ -16,6 +23,10 @@ interface IL2GNS is ICallhookReceiver { /** * @dev The SubgraphL2TransferData struct holds information * about a subgraph related to its transfer from L1 to L2. + * @param tokens GRT that will be sent to L2 to mint signal + * @param curatorBalanceClaimed True for curators whose balance has been claimed in L2 + * @param l2Done Transfer finished on L2 side + * @param subgraphReceivedOnL2BlockNumber Block number when the subgraph was received on L2 */ struct SubgraphL2TransferData { uint256 tokens; // GRT that will be sent to L2 to mint signal diff --git a/packages/contracts/contracts/l2/discovery/L2GNS.sol b/packages/contracts/contracts/l2/discovery/L2GNS.sol index 34d47d400..cf5528953 100644 --- a/packages/contracts/contracts/l2/discovery/L2GNS.sol +++ b/packages/contracts/contracts/l2/discovery/L2GNS.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-small-strings, gas-strict-inequalities + import { SafeMathUpgradeable } from "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import { GNS } from "../../discovery/GNS.sol"; @@ -14,7 +17,8 @@ import { IL2Curation } from "../curation/IL2Curation.sol"; /** * @title L2GNS - * @dev The Graph Name System contract provides a decentralized naming system for subgraphs + * @author Edge & Node + * @notice The Graph Name System contract provides a decentralized naming system for subgraphs * used in the scope of the Graph Network. It translates Subgraphs into Subgraph Versions. * Each version is associated with a Subgraph Deployment. The contract has no knowledge of * human-readable names. All human readable names emitted in events. @@ -26,35 +30,47 @@ import { IL2Curation } from "../curation/IL2Curation.sol"; contract L2GNS is GNS, L2GNSV1Storage, IL2GNS { using SafeMathUpgradeable for uint256; - /// Offset added to an L1 subgraph ID to compute the L2 subgraph ID alias + /// @notice Offset added to an L1 subgraph ID to compute the L2 subgraph ID alias uint256 public constant SUBGRAPH_ID_ALIAS_OFFSET = uint256(0x1111000000000000000000000000000000000000000000000000000000001111); - /// Maximum rounding error when receiving signal tokens from L1, in parts-per-million. - /// If the error from minting signal is above this, tokens will be sent back to the curator. + /// @notice Maximum rounding error when receiving signal tokens from L1, in parts-per-million + /// @dev If the error from minting signal is above this, tokens will be sent back to the curator uint256 public constant MAX_ROUNDING_ERROR = 1000; /// @dev 100% expressed in parts-per-million uint256 private constant MAX_PPM = 1000000; - /// @dev Emitted when a subgraph is received from L1 through the bridge + /// @notice Emitted when a subgraph is received from L1 through the bridge + /// @param _l1SubgraphID Subgraph ID on L1 + /// @param _l2SubgraphID Subgraph ID on L2 (aliased) + /// @param _owner Address of the subgraph owner + /// @param _tokens Amount of tokens transferred with the subgraph event SubgraphReceivedFromL1( uint256 indexed _l1SubgraphID, uint256 indexed _l2SubgraphID, address indexed _owner, uint256 _tokens ); - /// @dev Emitted when a subgraph transfer from L1 is finalized, so the subgraph is published on L2 + /// @notice Emitted when a subgraph transfer from L1 is finalized, so the subgraph is published on L2 + /// @param _l2SubgraphID Subgraph ID on L2 event SubgraphL2TransferFinalized(uint256 indexed _l2SubgraphID); - /// @dev Emitted when the L1 balance for a curator has been claimed + /// @notice Emitted when the L1 balance for a curator has been claimed + /// @param _l1SubgraphId Subgraph ID on L1 + /// @param _l2SubgraphID Subgraph ID on L2 (aliased) + /// @param _l2Curator Address of the curator on L2 + /// @param _tokens Amount of tokens received event CuratorBalanceReceived( uint256 indexed _l1SubgraphId, uint256 indexed _l2SubgraphID, address indexed _l2Curator, uint256 _tokens ); - /// @dev Emitted when the L1 balance for a curator has been returned to the beneficiary. + /// @notice Emitted when the L1 balance for a curator has been returned to the beneficiary. /// This can happen if the subgraph transfer was not finished when the curator's tokens arrived. + /// @param _l1SubgraphID Subgraph ID on L1 + /// @param _l2Curator Address of the curator on L2 + /// @param _tokens Amount of tokens returned event CuratorBalanceReturnedToBeneficiary( uint256 indexed _l1SubgraphID, address indexed _l2Curator, @@ -103,13 +119,7 @@ contract L2GNS is GNS, L2GNSV1Storage, IL2GNS { } /** - * @notice Finish a subgraph transfer from L1. - * The subgraph must have been previously sent through the bridge - * using the sendSubgraphToL2 function on L1GNS. - * @param _l2SubgraphID Subgraph ID (aliased from the L1 subgraph ID) - * @param _subgraphDeploymentID Latest subgraph deployment to assign to the subgraph - * @param _subgraphMetadata IPFS hash of the subgraph metadata - * @param _versionMetadata IPFS hash of the version metadata + * @inheritdoc IL2GNS */ function finishSubgraphTransferFromL1( uint256 _l2SubgraphID, @@ -220,25 +230,21 @@ contract L2GNS is GNS, L2GNSV1Storage, IL2GNS { } /** - * @notice Return the aliased L2 subgraph ID from a transferred L1 subgraph ID - * @param _l1SubgraphID L1 subgraph ID - * @return L2 subgraph ID + * @inheritdoc IL2GNS */ function getAliasedL2SubgraphID(uint256 _l1SubgraphID) public pure override returns (uint256) { return _l1SubgraphID + SUBGRAPH_ID_ALIAS_OFFSET; } /** - * @notice Return the unaliased L1 subgraph ID from a transferred L2 subgraph ID - * @param _l2SubgraphID L2 subgraph ID - * @return L1subgraph ID + * @inheritdoc IL2GNS */ function getUnaliasedL1SubgraphID(uint256 _l2SubgraphID) public pure override returns (uint256) { return _l2SubgraphID - SUBGRAPH_ID_ALIAS_OFFSET; } /** - * @dev Receive a subgraph from L1. + * @notice Receive a subgraph from L1. * This function will initialize a subgraph received through the bridge, * and store the transfer data so that it's finalized later using finishSubgraphTransferFromL1. * @param _l1SubgraphID Subgraph ID in L1 (will be aliased) @@ -308,9 +314,9 @@ contract L2GNS is GNS, L2GNSV1Storage, IL2GNS { } /** - * @dev Get subgraph data. - * Since there are no legacy subgraphs in L2, we override the base - * GNS method to save us the step of checking for legacy subgraphs. + * @notice Get subgraph data + * @dev Since there are no legacy subgraphs in L2, we override the base + * GNS method to save us the step of checking for legacy subgraphs * @param _subgraphID Subgraph ID * @return Subgraph Data */ diff --git a/packages/contracts/contracts/l2/discovery/L2GNSStorage.sol b/packages/contracts/contracts/l2/discovery/L2GNSStorage.sol index f658c49d9..26e7bf1e0 100644 --- a/packages/contracts/contracts/l2/discovery/L2GNSStorage.sol +++ b/packages/contracts/contracts/l2/discovery/L2GNSStorage.sol @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity ^0.7.6; pragma abicoder v2; @@ -7,11 +10,11 @@ import { IL2GNS } from "./IL2GNS.sol"; /** * @title L2GNSV1Storage + * @author Edge & Node * @notice This contract holds all the L2-specific storage variables for the L2GNS contract, version 1 - * @dev */ abstract contract L2GNSV1Storage { - /// Data for subgraph transfer from L1 to L2 + /// @notice Data for subgraph transfer from L1 to L2 mapping(uint256 => IL2GNS.SubgraphL2TransferData) public subgraphL2TransferData; /// @dev Storage gap to keep storage slots fixed in future versions uint256[50] private __gap; diff --git a/packages/contracts/contracts/l2/gateway/L2GraphTokenGateway.sol b/packages/contracts/contracts/l2/gateway/L2GraphTokenGateway.sol index be8f212b8..3b4c1c0ed 100644 --- a/packages/contracts/contracts/l2/gateway/L2GraphTokenGateway.sol +++ b/packages/contracts/contracts/l2/gateway/L2GraphTokenGateway.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import { SafeMathUpgradeable } from "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; @@ -16,7 +19,8 @@ import { L2GraphToken } from "../token/L2GraphToken.sol"; /** * @title L2 Graph Token Gateway Contract - * @dev Provides the L2 side of the Ethereum-Arbitrum GRT bridge. Receives GRT from the L1 chain + * @author Edge & Node + * @notice Provides the L2 side of the Ethereum-Arbitrum GRT bridge. Receives GRT from the L1 chain * and mints them on the L2 side. Sends GRT back to L1 by burning them on the L2 side. * Based on Offchain Labs' reference implementation and Livepeer's arbitrum-lpt-bridge * (See: https://github.com/OffchainLabs/arbitrum/tree/master/packages/arb-bridge-peripherals/contracts/tokenbridge @@ -25,23 +29,42 @@ import { L2GraphToken } from "../token/L2GraphToken.sol"; contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, ReentrancyGuardUpgradeable { using SafeMathUpgradeable for uint256; - /// Address of the Graph Token contract on L1 + /// @notice Address of the Graph Token contract on L1 address public l1GRT; - /// Address of the L1GraphTokenGateway that is the counterpart of this gateway on L1 + /// @notice Address of the L1GraphTokenGateway that is the counterpart of this gateway on L1 address public l1Counterpart; - /// Address of the Arbitrum Gateway Router on L2 + /// @notice Address of the Arbitrum Gateway Router on L2 address public l2Router; /// @dev Calldata included in an outbound transfer, stored as a structure for convenience and stack depth + /** + * @dev Struct for outbound transfer calldata + * @param from Address sending the tokens + * @param extraData Additional data for the transfer + */ struct OutboundCalldata { address from; bytes extraData; } - /// Emitted when an incoming transfer is finalized, i.e. tokens were deposited from L1 to L2 + /** + * @notice Emitted when an incoming transfer is finalized, i.e. tokens were deposited from L1 to L2 + * @param l1Token Address of the L1 token + * @param from Address sending the tokens on L1 + * @param to Address receiving the tokens on L2 + * @param amount Amount of tokens transferred + */ event DepositFinalized(address indexed l1Token, address indexed from, address indexed to, uint256 amount); - /// Emitted when an outbound transfer is initiated, i.e. tokens are being withdrawn from L2 back to L1 + /** + * @notice Emitted when an outbound transfer is initiated, i.e. tokens are being withdrawn from L2 back to L1 + * @param l1Token Address of the L1 token + * @param from Address sending the tokens on L2 + * @param to Address receiving the tokens on L1 + * @param l2ToL1Id ID of the L2 to L1 message + * @param exitNum Exit number (always 0 for this contract) + * @param amount Amount of tokens transferred + */ event WithdrawalInitiated( address l1Token, address indexed from, @@ -51,11 +74,22 @@ contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, Reentran uint256 amount ); - /// Emitted when the Arbitrum Gateway Router address on L2 has been updated + /** + * @notice Emitted when the Arbitrum Gateway Router address on L2 has been updated + * @param l2Router Address of the L2 Gateway Router + */ event L2RouterSet(address l2Router); - /// Emitted when the L1 Graph Token address has been updated + + /** + * @notice Emitted when the L1 Graph Token address has been updated + * @param l1GRT Address of the L1 GRT contract + */ event L1TokenAddressSet(address l1GRT); - /// Emitted when the address of the counterpart gateway on L1 has been updated + + /** + * @notice Emitted when the address of the counterpart gateway on L1 has been updated + * @param l1Counterpart Address of the L1 counterpart gateway + */ event L1CounterpartAddressSet(address l1Counterpart); /** @@ -135,7 +169,7 @@ contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, Reentran } /** - * @notice Receives token amount from L1 and mints the equivalent tokens to the receiving address + * @inheritdoc ITokenGateway * @dev Only accepts transactions from the L1 GRT Gateway. * The function is payable for ITokenGateway compatibility, but msg.value must be zero. * Note that allowlisted senders (some protocol contracts) can include additional calldata @@ -144,11 +178,6 @@ contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, Reentran * never succeeds. This requires extra care when adding contracts to the allowlist, but is necessary to ensure that * the tickets can be retried in the case of a temporary failure, and to ensure the atomicity of callhooks * with token transfers. - * @param _l1Token L1 Address of GRT - * @param _from Address of the sender on L1 - * @param _to Recipient address on L2 - * @param _amount Amount of tokens transferred - * @param _data Extra callhook data, only used when the sender is allowlisted */ function finalizeInboundTransfer( address _l1Token, @@ -170,18 +199,14 @@ contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, Reentran } /** - * @notice Burns L2 tokens and initiates a transfer to L1. + * @inheritdoc ITokenGateway + * @dev Burns L2 tokens and initiates a transfer to L1. * The tokens will be available on L1 only after the wait period (7 days) is over, * and will require an Outbox.executeTransaction to finalize. * Note that the caller must previously allow the gateway to spend the specified amount of GRT. - * @dev no additional callhook data is allowed. The two unused params are needed + * No additional callhook data is allowed. The two unused params are needed * for compatibility with Arbitrum's gateway router. * The function is payable for ITokenGateway compatibility, but msg.value must be zero. - * @param _l1Token L1 Address of GRT (needed for compatibility with Arbitrum Gateway Router) - * @param _to Recipient address on L1 - * @param _amount Amount of tokens to burn - * @param _data Contains sender and additional data (always empty) to send to L1 - * @return ID of the withdraw transaction */ function outboundTransfer( address _l1Token, @@ -218,10 +243,8 @@ contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, Reentran } /** - * @notice Calculate the L2 address of a bridged token + * @inheritdoc ITokenGateway * @dev In our case, this would only work for GRT. - * @param l1ERC20 address of L1 GRT contract - * @return L2 address of the bridged GRT token */ function calculateL2TokenAddress(address l1ERC20) public view override returns (address) { if (l1ERC20 != l1GRT) { @@ -259,10 +282,8 @@ contract L2GraphTokenGateway is GraphTokenGateway, L2ArbitrumMessenger, Reentran ); } - /** - * @dev Runs state validation before unpausing, reverts if - * something is not set properly - */ + /// @inheritdoc GraphTokenGateway + // solhint-disable-next-line use-natspec function _checksBeforeUnpause() internal view override { require(l2Router != address(0), "L2_ROUTER_NOT_SET"); require(l1Counterpart != address(0), "L1_COUNTERPART_NOT_SET"); diff --git a/packages/contracts/contracts/l2/staking/IL2Staking.sol b/packages/contracts/contracts/l2/staking/IL2Staking.sol index 4b7748e31..522a9ca12 100644 --- a/packages/contracts/contracts/l2/staking/IL2Staking.sol +++ b/packages/contracts/contracts/l2/staking/IL2Staking.sol @@ -9,6 +9,7 @@ import { IL2StakingTypes } from "./IL2StakingTypes.sol"; /** * @title Interface for the L2 Staking contract + * @author Edge & Node * @notice This is the interface that should be used when interacting with the L2 Staking contract. * It extends the IStaking interface with the functions that are specific to L2, adding the callhook receiver * to receive transferred stake and delegation from L1. diff --git a/packages/contracts/contracts/l2/staking/IL2StakingBase.sol b/packages/contracts/contracts/l2/staking/IL2StakingBase.sol index f5c33c2d0..7f861db39 100644 --- a/packages/contracts/contracts/l2/staking/IL2StakingBase.sol +++ b/packages/contracts/contracts/l2/staking/IL2StakingBase.sol @@ -2,13 +2,23 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; /** * @title Base interface for the L2Staking contract. + * @author Edge & Node * @notice This interface is used to define the callhook receiver interface that is implemented by L2Staking. * @dev Note it includes only the L2-specific functionality, not the full IStaking interface. */ interface IL2StakingBase is ICallhookReceiver { + /** + * @notice Emitted when transferred delegation is returned to a delegator + * @param indexer Address of the indexer + * @param delegator Address of the delegator + * @param amount Amount of delegation returned + */ event TransferredDelegationReturnedToDelegator(address indexed indexer, address indexed delegator, uint256 amount); } diff --git a/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol b/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol index 500694e89..722a2dbf4 100644 --- a/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol +++ b/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol @@ -2,6 +2,11 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title IL2StakingTypes + * @author Edge & Node + * @notice Interface defining types and enums used by L2 staking contracts + */ interface IL2StakingTypes { /// @dev Message codes for the L1 -> L2 bridge callhook enum L1MessageCodes { diff --git a/packages/contracts/contracts/l2/staking/L2Staking.sol b/packages/contracts/contracts/l2/staking/L2Staking.sol index 278e26a50..fb3784456 100644 --- a/packages/contracts/contracts/l2/staking/L2Staking.sol +++ b/packages/contracts/contracts/l2/staking/L2Staking.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { Staking } from "../../staking/Staking.sol"; import { IL2StakingBase } from "./IL2StakingBase.sol"; @@ -10,9 +13,13 @@ import { Stakes } from "../../staking/libs/Stakes.sol"; import { IStakes } from "../../staking/libs/IStakes.sol"; import { IL2StakingTypes } from "./IL2StakingTypes.sol"; +// solhint-disable-next-line no-unused-import +import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; // Used by @inheritdoc + /** * @title L2Staking contract - * @dev This contract is the L2 variant of the Staking contract. It adds a function + * @author Edge & Node + * @notice This contract is the L2 variant of the Staking contract. It adds a function * to receive an indexer's stake or delegation from L1. Note that this contract inherits Staking, * which uses a StakingExtension contract to implement the full IStaking interface through delegatecalls. */ @@ -24,10 +31,14 @@ contract L2Staking is Staking, IL2StakingBase { uint256 private constant MINIMUM_DELEGATION = 1e18; /** - * @dev Emitted when `delegator` delegated `tokens` to the `indexer`, the delegator + * @notice Emitted when `delegator` delegated `tokens` to the `indexer`, the delegator * gets `shares` for the delegation pool proportionally to the tokens staked. * This is copied from IStakingExtension, but we can't inherit from it because we * don't implement the full interface here. + * @param indexer Address of the indexer receiving the delegation + * @param delegator Address of the delegator + * @param tokens Amount of tokens delegated + * @param shares Amount of shares issued to the delegator */ event StakeDelegated(address indexed indexer, address indexed delegator, uint256 tokens, uint256 shares); @@ -48,7 +59,7 @@ contract L2Staking is Staking, IL2StakingBase { } /** - * @notice Receive tokens with a callhook from the bridge. + * @inheritdoc ICallhookReceiver * @dev The encoded _data can contain information about an indexer's stake * or a delegator's delegation. * See L1MessageCodes in IL2Staking for the supported messages. @@ -82,7 +93,7 @@ contract L2Staking is Staking, IL2StakingBase { } /** - * @dev Receive an Indexer's stake from L1. + * @notice Receive an Indexer's stake from L1. * The specified amount is added to the indexer's stake; the indexer's * address is specified in the _indexerData struct. * @param _amount Amount of tokens that were transferred @@ -105,7 +116,7 @@ contract L2Staking is Staking, IL2StakingBase { } /** - * @dev Receive a Delegator's delegation from L1. + * @notice Receive a Delegator's delegation from L1. * The specified amount is added to the delegator's delegation; the delegator's * address and the indexer's address are specified in the _delegationData struct. * Note that no delegation tax is applied here. diff --git a/packages/contracts/contracts/l2/token/GraphTokenUpgradeable.sol b/packages/contracts/contracts/l2/token/GraphTokenUpgradeable.sol index 0f5cf0ecb..d26371533 100644 --- a/packages/contracts/contracts/l2/token/GraphTokenUpgradeable.sol +++ b/packages/contracts/contracts/l2/token/GraphTokenUpgradeable.sol @@ -2,6 +2,10 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one, gas-small-strings, gas-strict-inequalities +// solhint-disable named-parameters-mapping + import { ERC20BurnableUpgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20BurnableUpgradeable.sol"; import { ECDSAUpgradeable } from "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol"; @@ -10,7 +14,8 @@ import { Governed } from "../../governance/Governed.sol"; /** * @title GraphTokenUpgradeable contract - * @dev This is the implementation of the ERC20 Graph Token. + * @author Edge & Node + * @notice This is the implementation of the ERC20 Graph Token. * The implementation exposes a permit() function to allow for a spender to send a signed message * and approve funds to a spender following EIP2612 to make integration with other contracts easier. * @@ -47,16 +52,23 @@ abstract contract GraphTokenUpgradeable is GraphUpgradeable, Governed, ERC20Burn bytes32 private DOMAIN_SEPARATOR; // solhint-disable-line var-name-mixedcase /// @dev Addresses for which this mapping is true are allowed to mint tokens mapping(address => bool) private _minters; - /// Nonces for permit signatures for each token holder + /// @notice Nonces for permit signatures for each token holder mapping(address => uint256) public nonces; /// @dev Storage gap added in case we need to add state variables to this contract uint256[47] private __gap; // -- Events -- - /// Emitted when a new minter is added + /** + * @notice Emitted when a new minter is added + * @param account Address of the minter that was added + */ event MinterAdded(address indexed account); - /// Emitted when a minter is removed + + /** + * @notice Emitted when a minter is removed + * @param account Address of the minter that was removed + */ event MinterRemoved(address indexed account); /// @dev Reverts if the caller is not an authorized minter @@ -145,7 +157,7 @@ abstract contract GraphTokenUpgradeable is GraphUpgradeable, Governed, ERC20Burn } /** - * @dev Graph Token Contract initializer. + * @notice Graph Token Contract initializer. * @param _owner Owner of this contract, who will hold the initial supply and will be a minter * @param _initialSupply Initial supply of GRT */ @@ -173,7 +185,7 @@ abstract contract GraphTokenUpgradeable is GraphUpgradeable, Governed, ERC20Burn } /** - * @dev Add a new minter. + * @notice Add a new minter. * @param _account Address of the minter */ function _addMinter(address _account) private { @@ -182,7 +194,7 @@ abstract contract GraphTokenUpgradeable is GraphUpgradeable, Governed, ERC20Burn } /** - * @dev Remove a minter. + * @notice Remove a minter. * @param _account Address of the minter */ function _removeMinter(address _account) private { @@ -191,7 +203,7 @@ abstract contract GraphTokenUpgradeable is GraphUpgradeable, Governed, ERC20Burn } /** - * @dev Get the running network chain ID. + * @notice Get the running network chain ID. * @return The chain ID */ function _getChainID() private pure returns (uint256) { diff --git a/packages/contracts/contracts/l2/token/L2GraphToken.sol b/packages/contracts/contracts/l2/token/L2GraphToken.sol index 639444870..c16f0164c 100644 --- a/packages/contracts/contracts/l2/token/L2GraphToken.sol +++ b/packages/contracts/contracts/l2/token/L2GraphToken.sol @@ -2,27 +2,48 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { GraphTokenUpgradeable } from "./GraphTokenUpgradeable.sol"; import { IArbToken } from "../../arbitrum/IArbToken.sol"; /** * @title L2 Graph Token Contract - * @dev Provides the L2 version of the GRT token, meant to be minted/burned + * @author Edge & Node + * @notice Provides the L2 version of the GRT token, meant to be minted/burned * through the L2GraphTokenGateway. */ contract L2GraphToken is GraphTokenUpgradeable, IArbToken { - /// Address of the gateway (on L2) that is allowed to mint tokens + /// @notice Address of the gateway (on L2) that is allowed to mint tokens address public gateway; - /// Address of the corresponding Graph Token contract on L1 + /// @notice Address of the corresponding Graph Token contract on L1 address public override l1Address; - /// Emitted when the bridge / gateway has minted new tokens, i.e. tokens were transferred to L2 + /** + * @notice Emitted when the bridge / gateway has minted new tokens, i.e. tokens were transferred to L2 + * @param account Address that received the minted tokens + * @param amount Amount of tokens minted + */ event BridgeMinted(address indexed account, uint256 amount); - /// Emitted when the bridge / gateway has burned tokens, i.e. tokens were transferred back to L1 + + /** + * @notice Emitted when the bridge / gateway has burned tokens, i.e. tokens were transferred back to L1 + * @param account Address from which tokens were burned + * @param amount Amount of tokens burned + */ event BridgeBurned(address indexed account, uint256 amount); - /// Emitted when the address of the gateway has been updated + + /** + * @notice Emitted when the address of the gateway has been updated + * @param gateway Address of the new gateway + */ event GatewaySet(address gateway); - /// Emitted when the address of the Graph Token contract on L1 has been updated + + /** + * @notice Emitted when the address of the Graph Token contract on L1 has been updated + * @param l1Address Address of the L1 Graph Token contract + */ event L1AddressSet(address l1Address); /** @@ -69,9 +90,8 @@ contract L2GraphToken is GraphTokenUpgradeable, IArbToken { } /** - * @notice Increases token supply, only callable by the L1/L2 bridge (when tokens are transferred to L2) - * @param _account Address to credit with the new tokens - * @param _amount Number of tokens to mint + * @inheritdoc IArbToken + * @dev Only callable by the L2GraphTokenGateway when tokens are transferred to L2 */ function bridgeMint(address _account, uint256 _amount) external override onlyGateway { _mint(_account, _amount); @@ -79,9 +99,8 @@ contract L2GraphToken is GraphTokenUpgradeable, IArbToken { } /** - * @notice Decreases token supply, only callable by the L1/L2 bridge (when tokens are transferred to L1). - * @param _account Address from which to extract the tokens - * @param _amount Number of tokens to burn + * @inheritdoc IArbToken + * @dev Only callable by the L2GraphTokenGateway when tokens are transferred back to L1 */ function bridgeBurn(address _account, uint256 _amount) external override onlyGateway { burnFrom(_account, _amount); diff --git a/packages/contracts/contracts/libraries/Base58Encoder.sol b/packages/contracts/contracts/libraries/Base58Encoder.sol index 9af197855..91caa8855 100644 --- a/packages/contracts/contracts/libraries/Base58Encoder.sol +++ b/packages/contracts/contracts/libraries/Base58Encoder.sol @@ -2,14 +2,25 @@ pragma solidity ^0.7.6; -/// @title Base58Encoder -/// @author Original author - Martin Lundfall (martin.lundfall@gmail.com) -/// Based on https://github.com/MrChico/verifyIPFS +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one + +/** + * @title Base58Encoder + * @author Original author - Martin Lundfall (martin.lundfall@gmail.com) + * @notice Library for encoding bytes to Base58 format, used for IPFS hashes + * @dev Based on https://github.com/MrChico/verifyIPFS + */ library Base58Encoder { - bytes constant sha256MultiHash = hex"1220"; - bytes constant ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + /// @dev SHA-256 multihash prefix for IPFS hashes + // solhint-disable-next-line const-name-snakecase + bytes internal constant sha256MultiHash = hex"1220"; + /// @dev Base58 alphabet used for encoding + bytes internal constant ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - /// @dev Converts hex string to base 58 + /// @notice Converts hex string to base 58 + /// @param source The bytes to encode + /// @return The base58 encoded bytes function encode(bytes memory source) internal pure returns (bytes memory) { if (source.length == 0) return new bytes(0); uint8[] memory digits = new uint8[](64); @@ -32,6 +43,12 @@ library Base58Encoder { return toAlphabet(reverse(truncate(digits, digitlength))); } + /** + * @notice Truncate an array to a specific length + * @param array The array to truncate + * @param length The desired length + * @return The truncated array + */ function truncate(uint8[] memory array, uint8 length) internal pure returns (uint8[] memory) { uint8[] memory output = new uint8[](length); for (uint256 i = 0; i < length; i++) { @@ -40,6 +57,11 @@ library Base58Encoder { return output; } + /** + * @notice Reverse an array + * @param input The array to reverse + * @return The reversed array + */ function reverse(uint8[] memory input) internal pure returns (uint8[] memory) { uint8[] memory output = new uint8[](input.length); for (uint256 i = 0; i < input.length; i++) { @@ -48,6 +70,11 @@ library Base58Encoder { return output; } + /** + * @notice Convert indices to alphabet characters + * @param indices The indices to convert + * @return The alphabet characters as bytes + */ function toAlphabet(uint8[] memory indices) internal pure returns (bytes memory) { bytes memory output = new bytes(indices.length); for (uint256 i = 0; i < indices.length; i++) { diff --git a/packages/contracts/contracts/libraries/HexStrings.sol b/packages/contracts/contracts/libraries/HexStrings.sol index 4842883a9..2b5e314e6 100644 --- a/packages/contracts/contracts/libraries/HexStrings.sol +++ b/packages/contracts/contracts/libraries/HexStrings.sol @@ -2,12 +2,22 @@ pragma solidity ^0.7.6; -/// @title HexStrings -/// Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8dd744fc1843d285c38e54e9d439dea7f6b93495/contracts/utils/Strings.sol +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one + +/** + * @title HexStrings + * @author Edge & Node + * @notice Library for converting values to hexadecimal string representations + * @dev Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8dd744fc1843d285c38e54e9d439dea7f6b93495/contracts/utils/Strings.sol + */ library HexStrings { + /// @dev Hexadecimal symbols used for string conversion bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; - /// @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation. + /// @param value The uint256 value to convert + /// @return The hexadecimal string representation function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; @@ -21,7 +31,10 @@ library HexStrings { return toHexString(value, length); } - /// @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + /// @param value The uint256 value to convert + /// @param length The fixed length of the output string + /// @return The hexadecimal string representation with fixed length function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; diff --git a/packages/contracts/contracts/payments/AllocationExchange.sol b/packages/contracts/contracts/payments/AllocationExchange.sol index 5f0b30b44..9bbd983a1 100644 --- a/packages/contracts/contracts/payments/AllocationExchange.sol +++ b/packages/contracts/contracts/payments/AllocationExchange.sol @@ -3,16 +3,20 @@ pragma solidity ^0.7.6; pragma abicoder v2; -import "@openzeppelin/contracts/cryptography/ECDSA.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -import "../governance/Governed.sol"; -import "../staking/IStaking.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-calldata-parameters, gas-increment-by-one, gas-indexed-events, gas-small-strings +// solhint-disable named-parameters-mapping + +import { ECDSA } from "@openzeppelin/contracts/cryptography/ECDSA.sol"; +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +import { Governed } from "../governance/Governed.sol"; +import { IStaking } from "../staking/IStaking.sol"; import { IGraphToken } from "../token/IGraphToken.sol"; /** * @title Allocation Exchange - * @dev This contract holds tokens that anyone with a voucher signed by the + * @author Edge & Node + * @notice This contract holds tokens that anyone with a voucher signed by the * authority can redeem. The contract validates if the voucher presented is valid * and then sends tokens to the Staking contract by calling the collect() function * passing the voucher allocationID. The contract enforces that only one voucher for @@ -20,9 +24,14 @@ import { IGraphToken } from "../token/IGraphToken.sol"; * Only governance can change the authority. */ contract AllocationExchange is Governed { - // An allocation voucher represents a signed message that allows - // redeeming an amount of funds from this contract and collect - // them as part of an allocation + /** + * @dev An allocation voucher represents a signed message that allows + * redeeming an amount of funds from this contract and collect + * them as part of an allocation + * @param allocationID Address of the allocation + * @param amount Amount of tokens to redeem + * @param signature Signature from the authority (65 bytes) + */ struct AllocationVoucher { address allocationID; uint256 amount; @@ -31,20 +40,43 @@ contract AllocationExchange is Governed { // -- Constants -- + /// @dev Maximum uint256 value used for unlimited token approvals uint256 private constant MAX_UINT256 = 2 ** 256 - 1; + /// @dev Expected length of ECDSA signatures uint256 private constant SIGNATURE_LENGTH = 65; // -- State -- - IStaking private immutable staking; - IGraphToken private immutable graphToken; + /// @dev Reference to the Staking contract + IStaking private immutable STAKING; + /// @dev Reference to the Graph Token contract + IGraphToken private immutable GRAPH_TOKEN; + /// @notice Mapping of authorized accounts that can redeem allocations mapping(address => bool) public authority; + /// @notice Mapping of allocations that have been redeemed mapping(address => bool) public allocationsRedeemed; // -- Events + /** + * @notice Emitted when an authority is set or unset + * @param account Address of the authority + * @param authorized Whether the authority is authorized + */ event AuthoritySet(address indexed account, bool authorized); + + /** + * @notice Emitted when an allocation voucher is redeemed + * @param allocationID Address of the allocation + * @param amount Amount of tokens redeemed + */ event AllocationRedeemed(address indexed allocationID, uint256 amount); + + /** + * @notice Emitted when tokens are withdrawn from the contract + * @param to Address that received the tokens + * @param amount Amount of tokens withdrawn + */ event TokensWithdrawn(address indexed to, uint256 amount); // -- Functions @@ -60,8 +92,8 @@ contract AllocationExchange is Governed { require(_governor != address(0), "Exchange: governor must be set"); Governed._initialize(_governor); - graphToken = _graphToken; - staking = _staking; + GRAPH_TOKEN = _graphToken; + STAKING = _staking; _setAuthority(_authority, true); } @@ -70,7 +102,7 @@ contract AllocationExchange is Governed { * @dev Increased gas efficiency instead of approving on each voucher redeem */ function approveAll() external { - graphToken.approve(address(staking), MAX_UINT256); + GRAPH_TOKEN.approve(address(STAKING), MAX_UINT256); } /** @@ -82,7 +114,7 @@ contract AllocationExchange is Governed { function withdraw(address _to, uint256 _amount) external onlyGovernor { require(_to != address(0), "Exchange: empty destination"); require(_amount != 0, "Exchange: empty amount"); - require(graphToken.transfer(_to, _amount), "Exchange: cannot transfer"); + require(GRAPH_TOKEN.transfer(_to, _amount), "Exchange: cannot transfer"); emit TokensWithdrawn(_to, _amount); } @@ -155,7 +187,7 @@ contract AllocationExchange is Governed { // Make the staking contract collect funds from this contract // The Staking contract will validate if the allocation is valid - staking.collect(_voucher.amount, _voucher.allocationID); + STAKING.collect(_voucher.amount, _voucher.allocationID); emit AllocationRedeemed(_voucher.allocationID, _voucher.amount); } diff --git a/packages/contracts/contracts/rewards/IRewardsIssuer.sol b/packages/contracts/contracts/rewards/IRewardsIssuer.sol index d50410b33..614dbf40e 100644 --- a/packages/contracts/contracts/rewards/IRewardsIssuer.sol +++ b/packages/contracts/contracts/rewards/IRewardsIssuer.sol @@ -2,9 +2,14 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Rewards Issuer Interface + * @author Edge & Node + * @notice Interface for contracts that issue rewards based on allocation data + */ interface IRewardsIssuer { /** - * @dev Get allocation data to calculate rewards issuance + * @notice Get allocation data to calculate rewards issuance * * @param allocationId The allocation Id * @return isActive Whether the allocation is active or not diff --git a/packages/contracts/contracts/rewards/IRewardsManager.sol b/packages/contracts/contracts/rewards/IRewardsManager.sol deleted file mode 100644 index b31064d1b..000000000 --- a/packages/contracts/contracts/rewards/IRewardsManager.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -pragma solidity ^0.7.6 || 0.8.27; - -interface IRewardsManager { - /** - * @dev Stores accumulated rewards and snapshots related to a particular SubgraphDeployment. - */ - struct Subgraph { - uint256 accRewardsForSubgraph; - uint256 accRewardsForSubgraphSnapshot; - uint256 accRewardsPerSignalSnapshot; - uint256 accRewardsPerAllocatedToken; - } - - // -- Config -- - - function setIssuancePerBlock(uint256 _issuancePerBlock) external; - - function setMinimumSubgraphSignal(uint256 _minimumSubgraphSignal) external; - - function setSubgraphService(address _subgraphService) external; - - // -- Denylist -- - - function setSubgraphAvailabilityOracle(address _subgraphAvailabilityOracle) external; - - function setDenied(bytes32 _subgraphDeploymentID, bool _deny) external; - - function isDenied(bytes32 _subgraphDeploymentID) external view returns (bool); - - // -- Getters -- - - function getNewRewardsPerSignal() external view returns (uint256); - - function getAccRewardsPerSignal() external view returns (uint256); - - function getAccRewardsForSubgraph(bytes32 _subgraphDeploymentID) external view returns (uint256); - - function getAccRewardsPerAllocatedToken(bytes32 _subgraphDeploymentID) external view returns (uint256, uint256); - - function getRewards(address _rewardsIssuer, address _allocationID) external view returns (uint256); - - function calcRewards(uint256 _tokens, uint256 _accRewardsPerAllocatedToken) external pure returns (uint256); - - // -- Updates -- - - function updateAccRewardsPerSignal() external returns (uint256); - - function takeRewards(address _allocationID) external returns (uint256); - - // -- Hooks -- - - function onSubgraphSignalUpdate(bytes32 _subgraphDeploymentID) external returns (uint256); - - function onSubgraphAllocationUpdate(bytes32 _subgraphDeploymentID) external returns (uint256); -} diff --git a/packages/contracts/contracts/rewards/RewardsManager.sol b/packages/contracts/contracts/rewards/RewardsManager.sol index 58f654b91..fc3c7da85 100644 --- a/packages/contracts/contracts/rewards/RewardsManager.sol +++ b/packages/contracts/contracts/rewards/RewardsManager.sol @@ -3,6 +3,9 @@ pragma solidity 0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one, gas-indexed-events, gas-small-strings, gas-strict-inequalities + import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; @@ -11,11 +14,13 @@ import { MathUtils } from "../staking/libs/MathUtils.sol"; import { IGraphToken } from "../token/IGraphToken.sol"; import { RewardsManagerV5Storage } from "./RewardsManagerStorage.sol"; -import { IRewardsManager } from "./IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; import { IRewardsIssuer } from "./IRewardsIssuer.sol"; /** * @title Rewards Manager Contract + * @author Edge & Node + * @notice Manages rewards distribution for indexers and delegators in the Graph Protocol * @dev Tracks how inflationary GRT rewards should be handed out. Relies on the Curation contract * and the Staking contract. Signaled GRT in Curation determine what percentage of the tokens go * towards each subgraph. Then each Subgraph can have multiple Indexers Staked on it. Thus, the @@ -30,6 +35,7 @@ import { IRewardsIssuer } from "./IRewardsIssuer.sol"; * - getRewards * These functions may overestimate the actual rewards due to changes in the total supply * until the actual takeRewards function is called. + * custom:security-contact Please email security+contracts@ thegraph.com (remove space) if you find any bugs. We might have an active bug bounty program. */ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsManager { using SafeMath for uint256; @@ -40,27 +46,32 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // -- Events -- /** - * @dev Emitted when rewards are assigned to an indexer. + * @notice Emitted when rewards are assigned to an indexer. * @dev We use the Horizon prefix to change the event signature which makes network subgraph development much easier + * @param indexer Address of the indexer receiving rewards + * @param allocationID Address of the allocation receiving rewards + * @param amount Amount of rewards assigned */ event HorizonRewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount); /** - * @dev Emitted when rewards are denied to an indexer + * @notice Emitted when rewards are denied to an indexer * @param indexer Address of the indexer being denied rewards * @param allocationID Address of the allocation being denied rewards */ event RewardsDenied(address indexed indexer, address indexed allocationID); /** - * @dev Emitted when a subgraph is denied for claiming rewards + * @notice Emitted when a subgraph is denied for claiming rewards * @param subgraphDeploymentID Subgraph deployment ID being denied * @param sinceBlock Block number since when the subgraph is denied */ event RewardsDenylistUpdated(bytes32 indexed subgraphDeploymentID, uint256 sinceBlock); /** - * @dev Emitted when the subgraph service is set + * @notice Emitted when the subgraph service is set + * @param oldSubgraphService Previous subgraph service address + * @param newSubgraphService New subgraph service address */ event SubgraphServiceSet(address indexed oldSubgraphService, address indexed newSubgraphService); @@ -85,20 +96,19 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // -- Config -- /** - * @dev Sets the GRT issuance per block. - * The issuance is defined as a fixed amount of rewards per block in GRT. + * @inheritdoc IRewardsManager + * @dev The issuance is defined as a fixed amount of rewards per block in GRT. * Whenever this function is called in layer 2, the updateL2MintAllowance function * _must_ be called on the L1GraphTokenGateway in L1, to ensure the bridge can mint the * right amount of tokens. - * @param _issuancePerBlock Issuance expressed in GRT per block (scaled by 1e18) */ function setIssuancePerBlock(uint256 _issuancePerBlock) external override onlyGovernor { _setIssuancePerBlock(_issuancePerBlock); } /** - * @dev Sets the GRT issuance per block. - * The issuance is defined as a fixed amount of rewards per block in GRT. + * @notice Sets the GRT issuance per block. + * @dev The issuance is defined as a fixed amount of rewards per block in GRT. * @param _issuancePerBlock Issuance expressed in GRT per block (scaled by 1e18) */ function _setIssuancePerBlock(uint256 _issuancePerBlock) private { @@ -110,8 +120,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @notice Sets the subgraph oracle allowed to deny distribution of rewards to subgraphs - * @param _subgraphAvailabilityOracle Address of the subgraph availability oracle + * @inheritdoc IRewardsManager */ function setSubgraphAvailabilityOracle(address _subgraphAvailabilityOracle) external override onlyGovernor { subgraphAvailabilityOracle = _subgraphAvailabilityOracle; @@ -119,7 +128,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @notice Sets the minimum signaled tokens on a subgraph to start accruing rewards + * @inheritdoc IRewardsManager * @dev Can be set to zero which means that this feature is not being used * @param _minimumSubgraphSignal Minimum signaled tokens */ @@ -133,6 +142,9 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa emit ParameterUpdated("minimumSubgraphSignal"); } + /** + * @inheritdoc IRewardsManager + */ function setSubgraphService(address _subgraphService) external override onlyGovernor { address oldSubgraphService = address(subgraphService); subgraphService = IRewardsIssuer(_subgraphService); @@ -142,17 +154,15 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // -- Denylist -- /** - * @notice Denies to claim rewards for a subgraph + * @inheritdoc IRewardsManager * @dev Can only be called by the subgraph availability oracle - * @param _subgraphDeploymentID Subgraph deployment ID - * @param _deny Whether to set the subgraph as denied for claiming rewards or not */ function setDenied(bytes32 _subgraphDeploymentID, bool _deny) external override onlySubgraphAvailabilityOracle { _setDenied(_subgraphDeploymentID, _deny); } /** - * @dev Internal: Denies to claim rewards for a subgraph. + * @notice Internal: Denies to claim rewards for a subgraph. * @param _subgraphDeploymentID Subgraph deployment ID * @param _deny Whether to set the subgraph as denied for claiming rewards or not */ @@ -162,11 +172,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa emit RewardsDenylistUpdated(_subgraphDeploymentID, sinceBlock); } - /** - * @notice Tells if subgraph is in deny list - * @param _subgraphDeploymentID Subgraph deployment ID to check - * @return Whether the subgraph is denied for claiming rewards or not - */ + /// @inheritdoc IRewardsManager function isDenied(bytes32 _subgraphDeploymentID) public view override returns (bool) { return denylist[_subgraphDeploymentID] > 0; } @@ -174,7 +180,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // -- Getters -- /** - * @notice Gets the issuance of rewards per signal since last updated + * @inheritdoc IRewardsManager * @dev Linear formula: `x = r * t` * * Notation: @@ -209,19 +215,12 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa return x.mul(FIXED_POINT_SCALING_FACTOR).div(signalledTokens); } - /** - * @notice Gets the currently accumulated rewards per signal - * @return Currently accumulated rewards per signal - */ + /// @inheritdoc IRewardsManager function getAccRewardsPerSignal() public view override returns (uint256) { return accRewardsPerSignal.add(getNewRewardsPerSignal()); } - /** - * @notice Gets the accumulated rewards for the subgraph - * @param _subgraphDeploymentID Subgraph deployment - * @return Accumulated rewards for subgraph - */ + /// @inheritdoc IRewardsManager function getAccRewardsForSubgraph(bytes32 _subgraphDeploymentID) public view override returns (uint256) { Subgraph storage subgraph = subgraphs[_subgraphDeploymentID]; @@ -237,12 +236,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa return subgraph.accRewardsForSubgraph.add(newRewards); } - /** - * @notice Gets the accumulated rewards per allocated token for the subgraph - * @param _subgraphDeploymentID Subgraph deployment - * @return Accumulated rewards per allocated token for the subgraph - * @return Accumulated rewards for subgraph - */ + /// @inheritdoc IRewardsManager function getAccRewardsPerAllocatedToken( bytes32 _subgraphDeploymentID ) public view override returns (uint256, uint256) { @@ -280,10 +274,9 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // -- Updates -- /** - * @notice Updates the accumulated rewards per signal and save checkpoint block number + * @inheritdoc IRewardsManager * @dev Must be called before `issuancePerBlock` or `total signalled GRT` changes. * Called from the Curation contract on mint() and burn() - * @return Accumulated rewards per signal */ function updateAccRewardsPerSignal() public override returns (uint256) { accRewardsPerSignal = getAccRewardsPerSignal(); @@ -292,11 +285,9 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @notice Triggers an update of rewards for a subgraph + * @inheritdoc IRewardsManager * @dev Must be called before `signalled GRT` on a subgraph changes. * Hook called from the Curation contract on mint() and burn() - * @param _subgraphDeploymentID Subgraph deployment - * @return Accumulated rewards for subgraph */ function onSubgraphSignalUpdate(bytes32 _subgraphDeploymentID) external override returns (uint256) { // Called since `total signalled GRT` will change @@ -310,12 +301,8 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @notice Triggers an update of rewards for a subgraph - * @dev Must be called before allocation on a subgraph changes. - * Hook called from the Staking contract on allocate() and close() - * - * @param _subgraphDeploymentID Subgraph deployment - * @return Accumulated rewards per allocated token for a subgraph + * @inheritdoc IRewardsManager + * @dev Hook called from the Staking contract on allocate() and close() */ function onSubgraphAllocationUpdate(bytes32 _subgraphDeploymentID) public override returns (uint256) { Subgraph storage subgraph = subgraphs[_subgraphDeploymentID]; @@ -327,13 +314,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa return subgraph.accRewardsPerAllocatedToken; } - /** - * @dev Calculate current rewards for a given allocation on demand. - * The allocation could be a legacy allocation or a new subgraph service allocation. - * Returns 0 if the allocation is not active. - * @param _allocationID Allocation - * @return Rewards amount for an allocation - */ + /// @inheritdoc IRewardsManager function getRewards(address _rewardsIssuer, address _allocationID) external view override returns (uint256) { require( _rewardsIssuer == address(staking()) || _rewardsIssuer == address(subgraphService), @@ -359,7 +340,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @dev Calculate rewards for a given accumulated rewards per allocated token. + * @notice Calculate rewards for a given accumulated rewards per allocated token * @param _tokens Tokens allocated * @param _accRewardsPerAllocatedToken Allocation accumulated rewards per token * @return Rewards amount @@ -372,7 +353,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @dev Calculate current rewards for a given allocation. + * @notice Calculate current rewards for a given allocation. * @param _tokens Tokens allocated * @param _startAccRewardsPerAllocatedToken Allocation start accumulated rewards * @param _endAccRewardsPerAllocatedToken Allocation end accumulated rewards @@ -388,13 +369,10 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /** - * @dev Pull rewards from the contract for a particular allocation. - * This function can only be called by an authorized rewards issuer which are + * @inheritdoc IRewardsManager + * @dev This function can only be called by an authorized rewards issuer which are * the staking contract (for legacy allocations), and the subgraph service (for new allocations). - * This function will mint the necessary tokens to reward based on the inflation calculation. * Mints 0 tokens if the allocation is not active. - * @param _allocationID Allocation - * @return Assigned rewards amount */ function takeRewards(address _allocationID) external override returns (uint256) { address rewardsIssuer = msg.sender; diff --git a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol index d2ffa2b42..27883d340 100644 --- a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol +++ b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol @@ -1,44 +1,77 @@ // SPDX-License-Identifier: GPL-2.0-or-later +/* solhint-disable one-contract-per-file */ + +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity ^0.7.6 || 0.8.27; import { IRewardsIssuer } from "./IRewardsIssuer.sol"; -import { IRewardsManager } from "./IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; import { Managed } from "../governance/Managed.sol"; +/** + * @title RewardsManagerV1Storage + * @author Edge & Node + * @notice Storage layout for RewardsManager V1 + */ contract RewardsManagerV1Storage is Managed { // -- State -- + /// @dev Deprecated issuance rate variable (no longer used) uint256 private __DEPRECATED_issuanceRate; // solhint-disable-line var-name-mixedcase + /// @notice Accumulated rewards per signal uint256 public accRewardsPerSignal; + /// @notice Block number when accumulated rewards per signal was last updated uint256 public accRewardsPerSignalLastBlockUpdated; - // Address of role allowed to deny rewards on subgraphs + /// @notice Address of role allowed to deny rewards on subgraphs address public subgraphAvailabilityOracle; - // Subgraph related rewards: subgraph deployment ID => subgraph rewards + /// @notice Subgraph related rewards: subgraph deployment ID => subgraph rewards mapping(bytes32 => IRewardsManager.Subgraph) public subgraphs; - // Subgraph denylist : subgraph deployment ID => block when added or zero (if not denied) + /// @notice Subgraph denylist: subgraph deployment ID => block when added or zero (if not denied) mapping(bytes32 => uint256) public denylist; } +/** + * @title RewardsManagerV2Storage + * @author Edge & Node + * @notice Storage layout for RewardsManager V2 + */ contract RewardsManagerV2Storage is RewardsManagerV1Storage { - // Minimum amount of signaled tokens on a subgraph required to accrue rewards + /// @notice Minimum amount of signaled tokens on a subgraph required to accrue rewards uint256 public minimumSubgraphSignal; } +/** + * @title RewardsManagerV3Storage + * @author Edge & Node + * @notice Storage layout for RewardsManager V3 + */ contract RewardsManagerV3Storage is RewardsManagerV2Storage { - // Snapshot of the total supply of GRT when accRewardsPerSignal was last updated + /// @dev Deprecated token supply snapshot variable (no longer used) uint256 private __DEPRECATED_tokenSupplySnapshot; // solhint-disable-line var-name-mixedcase } +/** + * @title RewardsManagerV4Storage + * @author Edge & Node + * @notice Storage layout for RewardsManager V4 + */ contract RewardsManagerV4Storage is RewardsManagerV3Storage { - // GRT issued for indexer rewards per block + /// @notice GRT issued for indexer rewards per block uint256 public issuancePerBlock; } +/** + * @title RewardsManagerV5Storage + * @author Edge & Node + * @notice Storage layout for RewardsManager V5 + */ contract RewardsManagerV5Storage is RewardsManagerV4Storage { - // Address of the subgraph service + /// @notice Address of the subgraph service IRewardsIssuer public subgraphService; } diff --git a/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol b/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol index 3c0c98cd2..d24577b42 100644 --- a/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol +++ b/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol @@ -2,12 +2,17 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one, gas-indexed-events, gas-small-strings, gas-strict-inequalities +// solhint-disable named-parameters-mapping + import { Governed } from "../governance/Governed.sol"; -import { IRewardsManager } from "./IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; /** * @title Subgraph Availability Manager - * @dev Manages the availability of subgraphs by allowing oracles to vote on whether + * @author Edge & Node + * @notice Manages the availability of subgraphs by allowing oracles to vote on whether * a subgraph should be denied rewards or not. When enough oracles have voted to deny or * allow rewards for a subgraph, it calls the RewardsManager Contract to set the correct * state. The oracles and the execution threshold are set at deployment time. @@ -21,15 +26,16 @@ contract SubgraphAvailabilityManager is Governed { uint256 public constant NUM_ORACLES = 5; /// @notice Number of votes required to execute a deny or allow call to the RewardsManager - uint256 public immutable executionThreshold; + uint256 public immutable executionThreshold; // solhint-disable-line immutable-vars-naming /// @dev Address of the RewardsManager contract + // solhint-disable-next-line immutable-vars-naming IRewardsManager private immutable rewardsManager; // -- State -- - /// @dev Nonce for generating votes on subgraph deployment IDs. - /// Increased whenever oracles or voteTimeLimit change, to invalidate old votes. + /// @notice Nonce for generating votes on subgraph deployment IDs + /// @dev Increased whenever oracles or voteTimeLimit change, to invalidate old votes uint256 public currentNonce; /// @notice Time limit for a vote to be valid @@ -39,30 +45,30 @@ contract SubgraphAvailabilityManager is Governed { address[NUM_ORACLES] public oracles; /// @notice Mapping of current nonce to subgraph deployment ID to an array of timestamps of last deny vote - /// currentNonce => subgraphDeploymentId => timestamp[oracleIndex] + /// @dev currentNonce => subgraphDeploymentId => timestamp[oracleIndex] mapping(uint256 => mapping(bytes32 => uint256[NUM_ORACLES])) public lastDenyVote; - /// @notice Mapping of current nonce to subgraph deployment ID to an array of timestamp of last allow vote - /// currentNonce => subgraphDeploymentId => timestamp[oracleIndex] + /// @notice Mapping of current nonce to subgraph deployment ID to an array of timestamp of last allow vote + /// @dev currentNonce => subgraphDeploymentId => timestamp[oracleIndex] mapping(uint256 => mapping(bytes32 => uint256[NUM_ORACLES])) public lastAllowVote; // -- Events -- /** - * @dev Emitted when an oracle is set + * @notice Emitted when an oracle is set * @param index Index of the oracle * @param oracle Address of the oracle */ event OracleSet(uint256 indexed index, address indexed oracle); /** - * @dev Emitted when the vote time limit is set + * @notice Emitted when the vote time limit is set * @param voteTimeLimit Vote time limit in seconds */ event VoteTimeLimitSet(uint256 voteTimeLimit); /** - * @dev Emitted when an oracle votes to deny or allow a subgraph + * @notice Emitted when an oracle votes to deny or allow a subgraph * @param subgraphDeploymentID Subgraph deployment ID * @param deny True to deny, false to allow * @param oracleIndex Index of the oracle voting @@ -72,6 +78,10 @@ contract SubgraphAvailabilityManager is Governed { // -- Modifiers -- + /** + * @dev Modifier to restrict access to authorized oracles only + * @param _oracleIndex Index of the oracle in the oracles array + */ modifier onlyOracle(uint256 _oracleIndex) { require(_oracleIndex < NUM_ORACLES, "SAM: index out of bounds"); require(msg.sender == oracles[_oracleIndex], "SAM: caller must be oracle"); @@ -81,7 +91,7 @@ contract SubgraphAvailabilityManager is Governed { // -- Constructor -- /** - * @dev Contract constructor + * @notice Contract constructor * @param _governor Account that can set or remove oracles and set the vote time limit * @param _rewardsManager Address of the RewardsManager contract * @param _executionThreshold Number of votes required to execute a deny or allow call to the RewardsManager @@ -118,7 +128,7 @@ contract SubgraphAvailabilityManager is Governed { // -- Functions -- /** - * @dev Set the vote time limit. Refreshes all existing votes by incrementing the current nonce. + * @notice Set the vote time limit. Refreshes all existing votes by incrementing the current nonce. * @param _voteTimeLimit Vote time limit in seconds */ function setVoteTimeLimit(uint256 _voteTimeLimit) external onlyGovernor { @@ -128,7 +138,7 @@ contract SubgraphAvailabilityManager is Governed { } /** - * @dev Set oracle address with index. Refreshes all existing votes by incrementing the current nonce. + * @notice Set oracle address with index. Refreshes all existing votes by incrementing the current nonce. * @param _index Index of the oracle * @param _oracle Address of the oracle */ @@ -144,7 +154,7 @@ contract SubgraphAvailabilityManager is Governed { } /** - * @dev Vote deny or allow for a subgraph. + * @notice Vote deny or allow for a subgraph. * NOTE: Can only be called by an oracle. * @param _subgraphDeploymentID Subgraph deployment ID * @param _deny True to deny, false to allow @@ -155,7 +165,7 @@ contract SubgraphAvailabilityManager is Governed { } /** - * @dev Vote deny or allow for many subgraphs. + * @notice Vote deny or allow for many subgraphs. * NOTE: Can only be called by an oracle. * @param _subgraphDeploymentID Array of subgraph deployment IDs * @param _deny Array of booleans, true to deny, false to allow @@ -173,7 +183,7 @@ contract SubgraphAvailabilityManager is Governed { } /** - * @dev Vote deny or allow for a subgraph. + * @notice Vote deny or allow for a subgraph. * When oracles cast their votes we store the timestamp of the vote. * Check if the execution threshold has been reached for a subgraph. * If execution threshold is reached we call the RewardsManager to set the correct state. @@ -203,7 +213,7 @@ contract SubgraphAvailabilityManager is Governed { } /** - * @dev Check if the execution threshold has been reached for a subgraph. + * @notice Check if the execution threshold has been reached for a subgraph. * For a vote to be valid it needs to be within the vote time limit. * @param _subgraphDeploymentID Subgraph deployment ID * @param _deny True to deny, false to allow diff --git a/packages/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol b/packages/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol index b935682b9..9a2224048 100644 --- a/packages/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol +++ b/packages/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol @@ -5,7 +5,8 @@ pragma abicoder v2; /** * @title Interface for the L1GraphTokenLockTransferTool contract - * @dev This interface defines the function to get the L2 wallet address for a given L1 token lock wallet. + * @author Edge & Node + * @notice This interface defines the function to get the L2 wallet address for a given L1 token lock wallet. * The Transfer Tool contract is implemented in the token-distribution repo: https://github.com/graphprotocol/token-distribution/pull/64 * and is only included here to provide support in L1Staking for the transfer of stake and delegation * owned by token lock contracts. See GIP-0046 for details: https://forum.thegraph.com/t/4023 diff --git a/packages/contracts/contracts/staking/IL1Staking.sol b/packages/contracts/contracts/staking/IL1Staking.sol index 4a446f787..d64372f0a 100644 --- a/packages/contracts/contracts/staking/IL1Staking.sol +++ b/packages/contracts/contracts/staking/IL1Staking.sol @@ -8,6 +8,7 @@ import { IL1StakingBase } from "./IL1StakingBase.sol"; /** * @title Interface for the L1 Staking contract + * @author Edge & Node * @notice This is the interface that should be used when interacting with the L1 Staking contract. * It extends the IStaking interface with the functions that are specific to L1, adding the transfer tools * to send stake and delegation to L2. diff --git a/packages/contracts/contracts/staking/IL1StakingBase.sol b/packages/contracts/contracts/staking/IL1StakingBase.sol index fad2136c2..09b2c3cca 100644 --- a/packages/contracts/contracts/staking/IL1StakingBase.sol +++ b/packages/contracts/contracts/staking/IL1StakingBase.sol @@ -3,23 +3,39 @@ pragma solidity >=0.6.12 <0.8.0; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IL1GraphTokenLockTransferTool } from "./IL1GraphTokenLockTransferTool.sol"; /** * @title Base interface for the L1Staking contract. + * @author Edge & Node * @notice This interface is used to define the transfer tools that are implemented in L1Staking. * @dev Note it includes only the L1-specific functionality, not the full IStaking interface. */ interface IL1StakingBase { - /// @dev Emitted when an indexer transfers their stake to L2. - /// This can happen several times as indexers can transfer partial stake. + /** + * @notice Emitted when an indexer transfers their stake to L2. + * This can happen several times as indexers can transfer partial stake. + * @param indexer Address of the indexer on L1 + * @param l2Indexer Address of the indexer on L2 + * @param transferredStakeTokens Amount of stake tokens transferred + */ event IndexerStakeTransferredToL2( address indexed indexer, address indexed l2Indexer, uint256 transferredStakeTokens ); - /// @dev Emitted when a delegator transfers their delegation to L2 + /** + * @notice Emitted when a delegator transfers their delegation to L2 + * @param delegator Address of the delegator on L1 + * @param l2Delegator Address of the delegator on L2 + * @param indexer Address of the indexer on L1 + * @param l2Indexer Address of the indexer on L2 + * @param transferredDelegationTokens Amount of delegation tokens transferred + */ event DelegationTransferredToL2( address indexed delegator, address indexed l2Delegator, @@ -28,10 +44,17 @@ interface IL1StakingBase { uint256 transferredDelegationTokens ); - /// @dev Emitted when the L1GraphTokenLockTransferTool is set + /** + * @notice Emitted when the L1GraphTokenLockTransferTool is set + * @param l1GraphTokenLockTransferTool Address of the L1GraphTokenLockTransferTool contract + */ event L1GraphTokenLockTransferToolSet(address l1GraphTokenLockTransferTool); - /// @dev Emitted when a delegator unlocks their tokens ahead of time because the indexer has transferred to L2 + /** + * @notice Emitted when a delegator unlocks their tokens ahead of time because the indexer has transferred to L2 + * @param indexer Address of the indexer that transferred to L2 + * @param delegator Address of the delegator unlocking their tokens + */ event StakeDelegatedUnlockedDueToL2Transfer(address indexed indexer, address indexed delegator); /** diff --git a/packages/contracts/contracts/staking/IStaking.sol b/packages/contracts/contracts/staking/IStaking.sol index a7d89feea..16c1db02d 100644 --- a/packages/contracts/contracts/staking/IStaking.sol +++ b/packages/contracts/contracts/staking/IStaking.sol @@ -10,6 +10,7 @@ import { IManaged } from "../governance/IManaged.sol"; /** * @title Interface for the Staking contract + * @author Edge & Node * @notice This is the interface that should be used when interacting with the Staking contract. * @dev Note that Staking doesn't actually inherit this interface. This is because of * the custom setup of the Staking contract where part of the functionality is implemented diff --git a/packages/contracts/contracts/staking/IStakingBase.sol b/packages/contracts/contracts/staking/IStakingBase.sol index 588144b2a..23b867dd4 100644 --- a/packages/contracts/contracts/staking/IStakingBase.sol +++ b/packages/contracts/contracts/staking/IStakingBase.sol @@ -3,10 +3,15 @@ pragma solidity >=0.6.12 <0.8.0 || 0.8.27; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IStakingData } from "./IStakingData.sol"; /** * @title Base interface for the Staking contract. + * @author Edge & Node + * @notice Base interface for the Staking contract. * @dev This interface includes only what's implemented in the base Staking contract. * It does not include the L1 and L2 specific functionality. It also does not include * several functions that are implemented in the StakingExtension contract, and are called @@ -15,25 +20,38 @@ import { IStakingData } from "./IStakingData.sol"; */ interface IStakingBase is IStakingData { /** - * @dev Emitted when `indexer` stakes `tokens` amount. + * @notice Emitted when `indexer` stakes `tokens` amount. + * @param indexer Address of the indexer + * @param tokens Amount of tokens staked */ event StakeDeposited(address indexed indexer, uint256 tokens); /** - * @dev Emitted when `indexer` unstaked and locked `tokens` amount until `until` block. + * @notice Emitted when `indexer` unstaked and locked `tokens` amount until `until` block. + * @param indexer Address of the indexer + * @param tokens Amount of tokens locked + * @param until Block number until which tokens are locked */ event StakeLocked(address indexed indexer, uint256 tokens, uint256 until); /** - * @dev Emitted when `indexer` withdrew `tokens` staked. + * @notice Emitted when `indexer` withdrew `tokens` staked. + * @param indexer Address of the indexer + * @param tokens Amount of tokens withdrawn */ event StakeWithdrawn(address indexed indexer, uint256 tokens); /** - * @dev Emitted when `indexer` allocated `tokens` amount to `subgraphDeploymentID` + * @notice Emitted when `indexer` allocated `tokens` amount to `subgraphDeploymentID` * during `epoch`. * `allocationID` indexer derived address used to identify the allocation. * `metadata` additional information related to the allocation. + * @param indexer Address of the indexer + * @param subgraphDeploymentID Subgraph deployment ID + * @param epoch Epoch when allocation was created + * @param tokens Amount of tokens allocated + * @param allocationID Allocation identifier + * @param metadata IPFS hash for additional allocation information */ event AllocationCreated( address indexed indexer, @@ -45,10 +63,18 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` close an allocation in `epoch` for `allocationID`. + * @notice Emitted when `indexer` close an allocation in `epoch` for `allocationID`. * An amount of `tokens` get unallocated from `subgraphDeploymentID`. * This event also emits the POI (proof of indexing) submitted by the indexer. * `isPublic` is true if the sender was someone other than the indexer. + * @param indexer Address of the indexer + * @param subgraphDeploymentID Subgraph deployment ID + * @param epoch Epoch when allocation was closed + * @param tokens Amount of tokens unallocated + * @param allocationID Allocation identifier + * @param sender Address that closed the allocation + * @param poi Proof of indexing submitted + * @param isPublic True if closed by someone other than the indexer */ event AllocationClosed( address indexed indexer, @@ -62,12 +88,23 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`. + * @notice Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`. * `epoch` is the protocol epoch the rebate was collected on * The rebate is for `tokens` amount which are being provided by `assetHolder`; `queryFees` * is the amount up for rebate after `curationFees` are distributed and `protocolTax` is burnt. * `queryRebates` is the amount distributed to the `indexer` with `delegationFees` collected * and sent to the delegation pool. + * @param assetHolder Address providing the rebate tokens + * @param indexer Address of the indexer collecting the rebate + * @param subgraphDeploymentID Subgraph deployment ID + * @param allocationID Allocation identifier + * @param epoch Epoch when rebate was collected + * @param tokens Total amount of tokens in the rebate + * @param protocolTax Amount burned as protocol tax + * @param curationFees Amount distributed to curators + * @param queryFees Amount available for rebate after fees + * @param queryRebates Amount distributed to the indexer + * @param delegationRewards Amount distributed to delegators */ event RebateCollected( address assetHolder, @@ -84,7 +121,11 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` update the delegation parameters for its delegation pool. + * @notice Emitted when `indexer` update the delegation parameters for its delegation pool. + * @param indexer Address of the indexer + * @param indexingRewardCut Percentage of indexing rewards left for the indexer + * @param queryFeeCut Percentage of query fees left for the indexer + * @param __DEPRECATED_cooldownBlocks Deprecated parameter (no longer used) */ event DelegationParametersUpdated( address indexed indexer, @@ -94,18 +135,24 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` set `operator` access. + * @notice Emitted when `indexer` set `operator` access. + * @param indexer Address of the indexer + * @param operator Address of the operator + * @param allowed Whether the operator is authorized */ event SetOperator(address indexed indexer, address indexed operator, bool allowed); /** - * @dev Emitted when `indexer` set an address to receive rewards. + * @notice Emitted when `indexer` set an address to receive rewards. + * @param indexer Address of the indexer + * @param destination Address to receive rewards */ event SetRewardsDestination(address indexed indexer, address indexed destination); /** - * @dev Emitted when `extensionImpl` was set as the address of the StakingExtension contract + * @notice Emitted when `extensionImpl` was set as the address of the StakingExtension contract * to which extended functionality is delegated. + * @param extensionImpl Address of the StakingExtension implementation */ event ExtensionImplementationSet(address indexed extensionImpl); @@ -260,12 +307,9 @@ interface IStakingBase is IStakingData { * @notice Set the delegation parameters for the caller. * @param _indexingRewardCut Percentage of indexing rewards left for the indexer * @param _queryFeeCut Percentage of query fees left for the indexer + * @param _cooldownBlocks Deprecated cooldown blocks parameter (no longer used) */ - function setDelegationParameters( - uint32 _indexingRewardCut, - uint32 _queryFeeCut, - uint32 // _cooldownBlocks, deprecated - ) external; + function setDelegationParameters(uint32 _indexingRewardCut, uint32 _queryFeeCut, uint32 _cooldownBlocks) external; /** * @notice Allocate available tokens to a subgraph deployment. @@ -362,18 +406,29 @@ interface IStakingBase is IStakingData { function getAllocation(address _allocationID) external view returns (Allocation memory); /** + * @notice Get the allocation data for the rewards manager * @dev New function to get the allocation data for the rewards manager * @dev Note that this is only to make tests pass, as the staking contract with * this changes will never get deployed. HorizonStaking is taking it's place. + * @param _allocationID The allocation identifier + * @return isActive Whether the allocation is active + * @return indexer Address of the indexer + * @return subgraphDeploymentID Subgraph deployment ID + * @return tokens Amount of tokens allocated + * @return createdAtEpoch Epoch when allocation was created + * @return closedAtEpoch Epoch when allocation was closed (0 if still active) */ function getAllocationData( address _allocationID ) external view returns (bool, address, bytes32, uint256, uint256, uint256); /** + * @notice Get the allocation active status for the rewards manager * @dev New function to get the allocation active status for the rewards manager * @dev Note that this is only to make tests pass, as the staking contract with * this changes will never get deployed. HorizonStaking is taking it's place. + * @param _allocationID The allocation identifier + * @return True if the allocation is active, false otherwise */ function isActiveAllocation(address _allocationID) external view returns (bool); diff --git a/packages/contracts/contracts/staking/IStakingData.sol b/packages/contracts/contracts/staking/IStakingData.sol index 149e3b8a6..edac435c7 100644 --- a/packages/contracts/contracts/staking/IStakingData.sol +++ b/packages/contracts/contracts/staking/IStakingData.sol @@ -4,12 +4,22 @@ pragma solidity >=0.6.12 <0.8.0 || 0.8.27; /** * @title Staking Data interface - * @dev This interface defines some structures used by the Staking contract. + * @author Edge & Node + * @notice This interface defines some structures used by the Staking contract. */ interface IStakingData { /** * @dev Allocate GRT tokens for the purpose of serving queries of a subgraph deployment * An allocation is created in the allocate() function and closed in closeAllocation() + * @param indexer Address of the indexer that owns the allocation + * @param subgraphDeploymentID Subgraph deployment ID being allocated to + * @param tokens Tokens allocated to a SubgraphDeployment + * @param createdAtEpoch Epoch when it was created + * @param closedAtEpoch Epoch when it was closed + * @param collectedFees Collected fees for the allocation + * @param __DEPRECATED_effectiveAllocation Deprecated field for effective allocation + * @param accRewardsPerAllocatedToken Snapshot used for reward calc + * @param distributedRebates Collected rebates that have been rebated */ struct Allocation { address indexer; @@ -27,6 +37,13 @@ interface IStakingData { /** * @dev Delegation pool information. One per indexer. + * @param __DEPRECATED_cooldownBlocks Deprecated field for cooldown blocks + * @param indexingRewardCut Indexing reward cut in PPM + * @param queryFeeCut Query fee cut in PPM + * @param updatedAtBlock Block when the pool was last updated + * @param tokens Total tokens as pool reserves + * @param shares Total shares minted in the pool + * @param delegators Mapping of delegator => Delegation */ struct DelegationPool { uint32 __DEPRECATED_cooldownBlocks; // solhint-disable-line var-name-mixedcase @@ -40,6 +57,9 @@ interface IStakingData { /** * @dev Individual delegation data of a delegator in a pool. + * @param shares Shares owned by a delegator in the pool + * @param tokensLocked Tokens locked for undelegation + * @param tokensLockedUntil Epoch when locked tokens can be withdrawn */ struct Delegation { uint256 shares; // Shares owned by a delegator in the pool @@ -49,6 +69,10 @@ interface IStakingData { /** * @dev Rebates parameters. Used to avoid stack too deep errors in Staking initialize function. + * @param alphaNumerator Alpha parameter numerator for rebate calculation + * @param alphaDenominator Alpha parameter denominator for rebate calculation + * @param lambdaNumerator Lambda parameter numerator for rebate calculation + * @param lambdaDenominator Lambda parameter denominator for rebate calculation */ struct RebatesParameters { uint32 alphaNumerator; diff --git a/packages/contracts/contracts/staking/IStakingExtension.sol b/packages/contracts/contracts/staking/IStakingExtension.sol index 9a998aac5..3053e7acf 100644 --- a/packages/contracts/contracts/staking/IStakingExtension.sol +++ b/packages/contracts/contracts/staking/IStakingExtension.sol @@ -3,12 +3,16 @@ pragma solidity >=0.6.12 <0.8.0 || 0.8.27; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IStakingData } from "./IStakingData.sol"; import { IStakes } from "./libs/IStakes.sol"; /** * @title Interface for the StakingExtension contract - * @dev This interface defines the events and functions implemented + * @author Edge & Node + * @notice This interface defines the events and functions implemented * in the StakingExtension contract, which is used to extend the functionality * of the Staking contract while keeping it within the 24kB mainnet size limit. * In particular, this interface includes delegation functions and various storage @@ -18,6 +22,12 @@ interface IStakingExtension is IStakingData { /** * @dev DelegationPool struct as returned by delegationPools(), since * the original DelegationPool in IStakingData.sol contains a nested mapping. + * @param __DEPRECATED_cooldownBlocks Deprecated field for cooldown blocks + * @param indexingRewardCut Indexing reward cut in PPM + * @param queryFeeCut Query fee cut in PPM + * @param updatedAtBlock Block when the pool was last updated + * @param tokens Total tokens as pool reserves + * @param shares Total shares minted in the pool */ struct DelegationPoolReturn { uint32 __DEPRECATED_cooldownBlocks; // solhint-disable-line var-name-mixedcase @@ -29,14 +39,23 @@ interface IStakingExtension is IStakingData { } /** - * @dev Emitted when `delegator` delegated `tokens` to the `indexer`, the delegator + * @notice Emitted when `delegator` delegated `tokens` to the `indexer`, the delegator * gets `shares` for the delegation pool proportionally to the tokens staked. + * @param indexer Address of the indexer receiving the delegation + * @param delegator Address of the delegator + * @param tokens Amount of tokens delegated + * @param shares Amount of shares issued to the delegator */ event StakeDelegated(address indexed indexer, address indexed delegator, uint256 tokens, uint256 shares); /** - * @dev Emitted when `delegator` undelegated `tokens` from `indexer`. + * @notice Emitted when `delegator` undelegated `tokens` from `indexer`. * Tokens get locked for withdrawal after a period of time. + * @param indexer Address of the indexer from which tokens are undelegated + * @param delegator Address of the delegator + * @param tokens Amount of tokens undelegated + * @param shares Amount of shares returned + * @param until Epoch until which tokens are locked */ event StakeDelegatedLocked( address indexed indexer, @@ -47,18 +66,28 @@ interface IStakingExtension is IStakingData { ); /** - * @dev Emitted when `delegator` withdrew delegated `tokens` from `indexer`. + * @notice Emitted when `delegator` withdrew delegated `tokens` from `indexer`. + * @param indexer Address of the indexer from which tokens are withdrawn + * @param delegator Address of the delegator + * @param tokens Amount of tokens withdrawn */ event StakeDelegatedWithdrawn(address indexed indexer, address indexed delegator, uint256 tokens); /** - * @dev Emitted when `indexer` was slashed for a total of `tokens` amount. + * @notice Emitted when `indexer` was slashed for a total of `tokens` amount. * Tracks `reward` amount of tokens given to `beneficiary`. + * @param indexer Address of the indexer that was slashed + * @param tokens Total amount of tokens slashed + * @param reward Amount of tokens given as reward + * @param beneficiary Address receiving the reward */ event StakeSlashed(address indexed indexer, uint256 tokens, uint256 reward, address beneficiary); /** - * @dev Emitted when `caller` set `slasher` address as `allowed` to slash stakes. + * @notice Emitted when `caller` set `slasher` address as `allowed` to slash stakes. + * @param caller Address that updated the slasher status + * @param slasher Address of the slasher + * @param allowed Whether the slasher is allowed to slash */ event SlasherUpdate(address indexed caller, address indexed slasher, bool allowed); @@ -114,6 +143,7 @@ interface IStakingExtension is IStakingData { * re-delegate to a new indexer. * @param _indexer Withdraw available tokens delegated to indexer * @param _newIndexer Re-delegate to indexer address if non-zero, withdraw if zero address + * @return Amount of tokens withdrawn */ function withdrawDelegated(address _indexer, address _newIndexer) external returns (uint256); diff --git a/packages/contracts/contracts/staking/L1Staking.sol b/packages/contracts/contracts/staking/L1Staking.sol index 78ce8bc63..2ffc3b62a 100644 --- a/packages/contracts/contracts/staking/L1Staking.sol +++ b/packages/contracts/contracts/staking/L1Staking.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines, gas-strict-inequalities + import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { ITokenGateway } from "../arbitrum/ITokenGateway.sol"; @@ -19,7 +22,8 @@ import { IL2StakingTypes } from "../l2/staking/IL2StakingTypes.sol"; /** * @title L1Staking contract - * @dev This contract is the L1 variant of the Staking contract. It adds functions + * @author Edge & Node + * @notice This contract is the L1 variant of the Staking contract. It adds functions * to send an indexer's stake to L2, and to send delegation to L2 as well. */ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { @@ -36,9 +40,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @notice Set the L1GraphTokenLockTransferTool contract address - * @dev This function can only be called by the governor. - * @param _l1GraphTokenLockTransferTool Address of the L1GraphTokenLockTransferTool contract + * @inheritdoc IL1StakingBase */ function setL1GraphTokenLockTransferTool( IL1GraphTokenLockTransferTool _l1GraphTokenLockTransferTool @@ -48,21 +50,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @notice Send an indexer's stake to L2. - * @dev This function can only be called by the indexer (not an operator). - * It will validate that the remaining stake is sufficient to cover all the allocated - * stake, so the indexer might have to close some allocations before transferring. - * It will also check that the indexer's stake is not locked for withdrawal. - * Since the indexer address might be an L1-only contract, the function takes a beneficiary - * address that will be the indexer's address in L2. - * The caller must provide an amount of ETH to use for the L2 retryable ticket, that - * must be at _exactly_ `_maxSubmissionCost + _gasPriceBid * _maxGas`. - * Any refunds for the submission fee or L2 gas will be lost. - * @param _l2Beneficiary Address of the indexer in L2. If the indexer has previously transferred stake, this must match the previously-used value. - * @param _amount Amount of stake GRT to transfer to L2 - * @param _maxGas Max gas to use for the L2 retryable ticket - * @param _gasPriceBid Gas price bid for the L2 retryable ticket - * @param _maxSubmissionCost Max submission cost for the L2 retryable ticket + * @inheritdoc IL1StakingBase */ function transferStakeToL2( address _l2Beneficiary, @@ -76,22 +64,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @notice Send an indexer's stake to L2, from a GraphTokenLockWallet vesting contract. - * @dev This function can only be called by the indexer (not an operator). - * It will validate that the remaining stake is sufficient to cover all the allocated - * stake, so the indexer might have to close some allocations before transferring. - * It will also check that the indexer's stake is not locked for withdrawal. - * The L2 beneficiary for the stake will be determined by calling the L1GraphTokenLockTransferTool contract, - * so the caller must have previously transferred tokens through that first - * (see GIP-0046 for details: https://forum.thegraph.com/t/4023). - * The ETH for the L2 gas will be pulled from the L1GraphTokenLockTransferTool, so the owner of - * the GraphTokenLockWallet must have previously deposited at least `_maxSubmissionCost + _gasPriceBid * _maxGas` - * ETH into the L1GraphTokenLockTransferTool contract (using its depositETH function). - * Any refunds for the submission fee or L2 gas will be lost. - * @param _amount Amount of stake GRT to transfer to L2 - * @param _maxGas Max gas to use for the L2 retryable ticket - * @param _gasPriceBid Gas price bid for the L2 retryable ticket - * @param _maxSubmissionCost Max submission cost for the L2 retryable ticket + * @inheritdoc IL1StakingBase */ function transferLockedStakeToL2( uint256 _amount, @@ -109,20 +82,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @notice Send a delegator's delegated tokens to L2 - * @dev This function can only be called by the delegator. - * This function will validate that the indexer has transferred their stake using transferStakeToL2, - * and that the delegation is not locked for undelegation. - * Since the delegator's address might be an L1-only contract, the function takes a beneficiary - * address that will be the delegator's address in L2. - * The caller must provide an amount of ETH to use for the L2 retryable ticket, that - * must be _exactly_ `_maxSubmissionCost + _gasPriceBid * _maxGas`. - * Any refunds for the submission fee or L2 gas will be lost. - * @param _indexer Address of the indexer (in L1, before transferring to L2) - * @param _l2Beneficiary Address of the delegator in L2 - * @param _maxGas Max gas to use for the L2 retryable ticket - * @param _gasPriceBid Gas price bid for the L2 retryable ticket - * @param _maxSubmissionCost Max submission cost for the L2 retryable ticket + * @inheritdoc IL1StakingBase */ function transferDelegationToL2( address _indexer, @@ -144,21 +104,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @notice Send a delegator's delegated tokens to L2, for a GraphTokenLockWallet vesting contract - * @dev This function can only be called by the delegator. - * This function will validate that the indexer has transferred their stake using transferStakeToL2, - * and that the delegation is not locked for undelegation. - * The L2 beneficiary for the delegation will be determined by calling the L1GraphTokenLockTransferTool contract, - * so the caller must have previously transferred tokens through that first - * (see GIP-0046 for details: https://forum.thegraph.com/t/4023). - * The ETH for the L2 gas will be pulled from the L1GraphTokenLockTransferTool, so the owner of - * the GraphTokenLockWallet must have previously deposited at least `_maxSubmissionCost + _gasPriceBid * _maxGas` - * ETH into the L1GraphTokenLockTransferTool contract (using its depositETH function). - * Any refunds for the submission fee or L2 gas will be lost. - * @param _indexer Address of the indexer (in L1, before transferring to L2) - * @param _maxGas Max gas to use for the L2 retryable ticket - * @param _gasPriceBid Gas price bid for the L2 retryable ticket - * @param _maxSubmissionCost Max submission cost for the L2 retryable ticket + * @inheritdoc IL1StakingBase */ function transferLockedDelegationToL2( address _indexer, @@ -184,13 +130,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @notice Unlock a delegator's delegated tokens, if the indexer has transferred to L2 - * @dev This function can only be called by the delegator. - * This function will validate that the indexer has transferred their stake using transferStakeToL2, - * and that the indexer has no remaining stake in L1. - * The tokens must previously be locked for undelegation by calling `undelegate()`, - * and can be withdrawn with `withdrawDelegated()` immediately after calling this. - * @param _indexer Address of the indexer (in L1, before transferring to L2) + * @inheritdoc IL1StakingBase */ function unlockDelegationToTransferredIndexer(address _indexer) external override notPartialPaused { require( @@ -209,13 +149,14 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @dev Implements sending an indexer's stake to L2. + * @notice Implements sending an indexer's stake to L2. * This function can only be called by the indexer (not an operator). * It will validate that the remaining stake is sufficient to cover all the allocated * stake, so the indexer might have to close some allocations before transferring. * It will also check that the indexer's stake is not locked for withdrawal. * Since the indexer address might be an L1-only contract, the function takes a beneficiary * address that will be the indexer's address in L2. + * @param _indexer Address of the indexer transferring stake * @param _l2Beneficiary Address of the indexer in L2. If the indexer has previously transferred stake, this must match the previously-used value. * @param _amount Amount of stake GRT to transfer to L2 * @param _maxGas Max gas to use for the L2 retryable ticket @@ -282,12 +223,13 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @dev Implements sending a delegator's delegated tokens to L2. + * @notice Implements sending a delegator's delegated tokens to L2. * This function can only be called by the delegator. * This function will validate that the indexer has transferred their stake using transferStakeToL2, * and that the delegation is not locked for undelegation. * Since the delegator's address might be an L1-only contract, the function takes a beneficiary * address that will be the delegator's address in L2. + * @param _delegator Address of the delegator transferring delegation * @param _indexer Address of the indexer (in L1, before transferring to L2) * @param _l2Beneficiary Address of the delegator in L2 * @param _maxGas Max gas to use for the L2 retryable ticket @@ -352,7 +294,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { } /** - * @dev Sends a message to the L2Staking with some extra data, + * @notice Sends a message to the L2Staking with some extra data, * also sending some tokens, using the L1GraphTokenGateway. * @param _tokens Amount of tokens to send to L2 * @param _maxGas Max gas to use for the L2 retryable ticket diff --git a/packages/contracts/contracts/staking/L1StakingStorage.sol b/packages/contracts/contracts/staking/L1StakingStorage.sol index bd7a7f0ee..b07ffa5e1 100644 --- a/packages/contracts/contracts/staking/L1StakingStorage.sol +++ b/packages/contracts/contracts/staking/L1StakingStorage.sol @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity ^0.7.6; pragma abicoder v2; @@ -7,12 +10,13 @@ import { IL1GraphTokenLockTransferTool } from "./IL1GraphTokenLockTransferTool.s /** * @title L1StakingV1Storage + * @author Edge & Node * @notice This contract holds all the L1-specific storage variables for the L1Staking contract, version 1 * @dev When adding new versions, make sure to move the gap to the new version and * reduce the size of the gap accordingly. */ abstract contract L1StakingV1Storage { - /// If an indexer has transferred to L2, this mapping will hold the indexer's address in L2 + /// @notice If an indexer has transferred to L2, this mapping will hold the indexer's address in L2 mapping(address => address) public indexerTransferredToL2; /// @dev For locked indexers/delegations, this contract holds the mapping of L1 to L2 addresses IL1GraphTokenLockTransferTool internal l1GraphTokenLockTransferTool; diff --git a/packages/contracts/contracts/staking/Staking.sol b/packages/contracts/contracts/staking/Staking.sol index c61fe0ded..4f6107bd0 100644 --- a/packages/contracts/contracts/staking/Staking.sol +++ b/packages/contracts/contracts/staking/Staking.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines, gas-strict-inequalities + import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { ECDSA } from "@openzeppelin/contracts/cryptography/ECDSA.sol"; @@ -17,13 +20,14 @@ import { Stakes } from "./libs/Stakes.sol"; import { IStakes } from "./libs/IStakes.sol"; import { Managed } from "../governance/Managed.sol"; import { ICuration } from "../curation/ICuration.sol"; -import { IRewardsManager } from "../rewards/IRewardsManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; import { StakingExtension } from "./StakingExtension.sol"; import { LibExponential } from "./libs/Exponential.sol"; /** * @title Base Staking contract - * @dev The Staking contract allows Indexers to Stake on Subgraphs. Indexers Stake by creating + * @author Edge & Node + * @notice The Staking contract allows Indexers to Stake on Subgraphs. Indexers Stake by creating * Allocations on a Subgraph. It also allows Delegators to Delegate towards an Indexer. The * contract also has the slashing functionality. * The contract is abstract as the implementation that is deployed depends on each layer: L1Staking on mainnet @@ -45,9 +49,11 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M * @dev This function does not return to its internal call site, it will return directly to the * external caller. */ - // solhint-disable-next-line payable-fallback, no-complex-fallback fallback() external { + // solhint-disable-previous-line payable-fallback, no-complex-fallback + require(_implementation() != address(0), "only through proxy"); + // solhint-disable-next-line no-inline-assembly assembly { // (a) get free memory pointer @@ -80,17 +86,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Initialize this contract. - * @param _controller Address of the controller that manages this contract - * @param _minimumIndexerStake Minimum amount of tokens that an indexer must stake - * @param _thawingPeriod Number of epochs that tokens get locked after unstaking - * @param _protocolPercentage Percentage of query fees that are burned as protocol fee (in PPM) - * @param _curationPercentage Percentage of query fees that are given to curators (in PPM) - * @param _maxAllocationEpochs The maximum number of epochs that an allocation can be active - * @param _delegationUnbondingPeriod The period in epochs that tokens get locked after undelegating - * @param _delegationRatio The ratio between an indexer's own stake and the delegation they can use - * @param _rebatesParameters Alpha and lambda parameters for rebates function - * @param _extensionImpl Address of the StakingExtension implementation + * @inheritdoc IStakingBase */ function initialize( address _controller, @@ -140,9 +136,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Set the address of the StakingExtension implementation. - * @dev This function can only be called by the governor. - * @param _extensionImpl Address of the StakingExtension implementation + * @inheritdoc IStakingBase */ function setExtensionImpl(address _extensionImpl) external override onlyGovernor { extensionImpl = _extensionImpl; @@ -150,9 +144,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Set the address of the counterpart (L1 or L2) staking contract. - * @dev This function can only be called by the governor. - * @param _counterpart Address of the counterpart staking contract in the other chain, without any aliasing. + * @inheritdoc IStakingBase */ function setCounterpartStakingAddress(address _counterpart) external override onlyGovernor { counterpartStakingAddress = _counterpart; @@ -160,52 +152,42 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Set the minimum stake required to be an indexer. - * @param _minimumIndexerStake Minimum indexer stake + * @inheritdoc IStakingBase */ function setMinimumIndexerStake(uint256 _minimumIndexerStake) external override onlyGovernor { _setMinimumIndexerStake(_minimumIndexerStake); } /** - * @notice Set the thawing period for unstaking. - * @param _thawingPeriod Period in blocks to wait for token withdrawals after unstaking + * @inheritdoc IStakingBase */ function setThawingPeriod(uint32 _thawingPeriod) external override onlyGovernor { _setThawingPeriod(_thawingPeriod); } /** - * @notice Set the curation percentage of query fees sent to curators. - * @param _percentage Percentage of query fees sent to curators + * @inheritdoc IStakingBase */ function setCurationPercentage(uint32 _percentage) external override onlyGovernor { _setCurationPercentage(_percentage); } /** - * @notice Set a protocol percentage to burn when collecting query fees. - * @param _percentage Percentage of query fees to burn as protocol fee + * @inheritdoc IStakingBase */ function setProtocolPercentage(uint32 _percentage) external override onlyGovernor { _setProtocolPercentage(_percentage); } /** - * @notice Set the max time allowed for indexers to allocate on a subgraph - * before others are allowed to close the allocation. - * @param _maxAllocationEpochs Allocation duration limit in epochs + * @inheritdoc IStakingBase */ function setMaxAllocationEpochs(uint32 _maxAllocationEpochs) external override onlyGovernor { _setMaxAllocationEpochs(_maxAllocationEpochs); } /** - * @dev Set the rebate parameters. - * @param _alphaNumerator Numerator of `alpha` in the rebates function - * @param _alphaDenominator Denominator of `alpha` in the rebates function - * @param _lambdaNumerator Numerator of `lambda` in the rebates function - * @param _lambdaDenominator Denominator of `lambda` in the rebates function + * @inheritdoc IStakingBase */ function setRebateParameters( uint32 _alphaNumerator, @@ -217,9 +199,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Authorize or unauthorize an address to be an operator for the caller. - * @param _operator Address to authorize or unauthorize - * @param _allowed Whether the operator is authorized or not + * @inheritdoc IStakingBase */ function setOperator(address _operator, bool _allowed) external override { require(_operator != msg.sender, "operator == sender"); @@ -228,21 +208,18 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Deposit tokens on the indexer's stake. - * The amount staked must be over the minimumIndexerStake. - * @param _tokens Amount of tokens to stake + * @inheritdoc IStakingBase */ function stake(uint256 _tokens) external override { stakeTo(msg.sender, _tokens); } /** - * @notice Unstake tokens from the indexer stake, lock them until the thawing period expires. + * @inheritdoc IStakingBase * @dev NOTE: The function accepts an amount greater than the currently staked tokens. * If that happens, it will try to unstake the max amount of tokens it can. * The reason for this behaviour is to avoid time conditions while the transaction * is in flight. - * @param _tokens Amount of tokens to unstake */ function unstake(uint256 _tokens) external override notPartialPaused { address indexer = msg.sender; @@ -271,15 +248,14 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Withdraw indexer tokens once the thawing period has passed. + * @inheritdoc IStakingBase */ function withdraw() external override notPaused { _withdraw(msg.sender); } /** - * @notice Set the destination where to send rewards for an indexer. - * @param _destination Rewards destination address. If set to zero, rewards will be restaked + * @inheritdoc IStakingBase */ function setRewardsDestination(address _destination) external override { __rewardsDestination[msg.sender] = _destination; @@ -287,12 +263,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Allocate available tokens to a subgraph deployment. - * @param _subgraphDeploymentID ID of the SubgraphDeployment where tokens will be allocated - * @param _tokens Amount of tokens to allocate - * @param _allocationID The allocation identifier - * @param _metadata IPFS hash for additional information about the allocation - * @param _proof A 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationID)` + * @inheritdoc IStakingBase */ function allocate( bytes32 _subgraphDeploymentID, @@ -305,14 +276,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Allocate available tokens to a subgraph deployment from and indexer's stake. - * The caller must be the indexer or the indexer's operator. - * @param _indexer Indexer address to allocate funds from. - * @param _subgraphDeploymentID ID of the SubgraphDeployment where tokens will be allocated - * @param _tokens Amount of tokens to allocate - * @param _allocationID The allocation identifier - * @param _metadata IPFS hash for additional information about the allocation - * @param _proof A 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationID)` + * @inheritdoc IStakingBase */ function allocateFrom( address _indexer, @@ -326,25 +290,20 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Close an allocation and free the staked tokens. - * To be eligible for rewards a proof of indexing must be presented. + * @inheritdoc IStakingBase + * @dev To be eligible for rewards a proof of indexing must be presented. * Presenting a bad proof is subject to slashable condition. * To opt out of rewards set _poi to 0x0 - * @param _allocationID The allocation identifier - * @param _poi Proof of indexing submitted for the allocated period */ function closeAllocation(address _allocationID, bytes32 _poi) external override notPaused { _closeAllocation(_allocationID, _poi); } /** - * @dev Collect and rebate query fees from state channels to the indexer - * To avoid reverting on the withdrawal from channel flow this function will accept calls with zero tokens. - * We use an exponential rebate formula to calculate the amount of tokens to rebate to the indexer. + * @inheritdoc IStakingBase + * @dev We use an exponential rebate formula to calculate the amount of tokens to rebate to the indexer. * This implementation allows collecting multiple times on the same allocation, keeping track of the * total amount rebated, the total amount collected and compensating the indexer for the difference. - * @param _tokens Amount of tokens to collect - * @param _allocationID Allocation where the tokens will be assigned */ function collect(uint256 _tokens, address _allocationID) external override { // Allocation identifier validation @@ -447,36 +406,28 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Return if allocationID is used. - * @param _allocationID Address used as signer by the indexer for an allocation - * @return True if allocationID already used + * @inheritdoc IStakingBase */ function isAllocation(address _allocationID) external view override returns (bool) { return _getAllocationState(_allocationID) != AllocationState.Null; } /** - * @notice Getter that returns if an indexer has any stake. - * @param _indexer Address of the indexer - * @return True if indexer has staked tokens + * @inheritdoc IStakingBase */ function hasStake(address _indexer) external view override returns (bool) { return __stakes[_indexer].tokensStaked > 0; } /** - * @notice Return the allocation by ID. - * @param _allocationID Address used as allocation identifier - * @return Allocation data + * @inheritdoc IStakingBase */ function getAllocation(address _allocationID) external view override returns (Allocation memory) { return __allocations[_allocationID]; } /** - * @dev New function to get the allocation data for the rewards manager - * @dev Note that this is only to make tests pass, as the staking contract with - * this changes will never get deployed. HorizonStaking is taking it's place. + * @inheritdoc IStakingBase */ function getAllocationData( address _allocationID @@ -495,46 +446,35 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev New function to get the allocation active status for the rewards manager - * @dev Note that this is only to make tests pass, as the staking contract with - * this changes will never get deployed. HorizonStaking is taking it's place. + * @inheritdoc IStakingBase */ function isActiveAllocation(address _allocationID) external view override returns (bool) { return _getAllocationState(_allocationID) == AllocationState.Active; } /** - * @notice Return the current state of an allocation - * @param _allocationID Allocation identifier - * @return AllocationState enum with the state of the allocation + * @inheritdoc IStakingBase */ function getAllocationState(address _allocationID) external view override returns (AllocationState) { return _getAllocationState(_allocationID); } /** - * @notice Return the total amount of tokens allocated to subgraph. - * @param _subgraphDeploymentID Deployment ID for the subgraph - * @return Total tokens allocated to subgraph + * @inheritdoc IStakingBase */ function getSubgraphAllocatedTokens(bytes32 _subgraphDeploymentID) external view override returns (uint256) { return __subgraphAllocations[_subgraphDeploymentID]; } /** - * @notice Get the total amount of tokens staked by the indexer. - * @param _indexer Address of the indexer - * @return Amount of tokens staked by the indexer + * @inheritdoc IStakingBase */ function getIndexerStakedTokens(address _indexer) external view override returns (uint256) { return __stakes[_indexer].tokensStaked; } /** - * @notice Deposit tokens on the Indexer stake, on behalf of the Indexer. - * The amount staked must be over the minimumIndexerStake. - * @param _indexer Address of the indexer - * @param _tokens Amount of tokens to stake + * @inheritdoc IStakingBase */ function stakeTo(address _indexer, uint256 _tokens) public override notPartialPaused { require(_tokens > 0, "!tokens"); @@ -547,9 +487,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Set the delegation parameters for the caller. - * @param _indexingRewardCut Percentage of indexing rewards left for the indexer - * @param _queryFeeCut Percentage of query fees left for the indexer + * @inheritdoc IStakingBase */ function setDelegationParameters( uint32 _indexingRewardCut, @@ -560,10 +498,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Get the total amount of tokens available to use in allocations. - * This considers the indexer stake and delegated tokens according to delegation ratio - * @param _indexer Address of the indexer - * @return Amount of tokens available to allocate including delegation + * @inheritdoc IStakingBase */ function getIndexerCapacity(address _indexer) public view override returns (uint256) { IStakes.Indexer memory indexerStake = __stakes[_indexer]; @@ -576,17 +511,14 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @notice Return true if operator is allowed for indexer. - * @param _operator Address of the operator - * @param _indexer Address of the indexer - * @return True if operator is allowed for indexer, false otherwise + * @inheritdoc IStakingBase */ function isOperator(address _operator, address _indexer) public view override returns (bool) { return __operatorAuth[_indexer][_operator]; } /** - * @dev Internal: Set the minimum indexer stake required. + * @notice Internal: Set the minimum indexer stake required. * @param _minimumIndexerStake Minimum indexer stake */ function _setMinimumIndexerStake(uint256 _minimumIndexerStake) private { @@ -596,7 +528,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Internal: Set the thawing period for unstaking. + * @notice Internal: Set the thawing period for unstaking. * @param _thawingPeriod Period in blocks to wait for token withdrawals after unstaking */ function _setThawingPeriod(uint32 _thawingPeriod) private { @@ -606,7 +538,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Internal: Set the curation percentage of query fees sent to curators. + * @notice Internal: Set the curation percentage of query fees sent to curators. * @param _percentage Percentage of query fees sent to curators */ function _setCurationPercentage(uint32 _percentage) private { @@ -617,7 +549,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Internal: Set a protocol percentage to burn when collecting query fees. + * @notice Internal: Set a protocol percentage to burn when collecting query fees. * @param _percentage Percentage of query fees to burn as protocol fee */ function _setProtocolPercentage(uint32 _percentage) private { @@ -628,7 +560,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Internal: Set the max time allowed for indexers stake on allocations. + * @notice Internal: Set the max time allowed for indexers stake on allocations. * @param _maxAllocationEpochs Allocation duration limit in epochs */ function _setMaxAllocationEpochs(uint32 _maxAllocationEpochs) private { @@ -637,7 +569,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Set the rebate parameters. + * @notice Set the rebate parameters. * @param _alphaNumerator Numerator of `alpha` in the rebates function * @param _alphaDenominator Denominator of `alpha` in the rebates function * @param _lambdaNumerator Numerator of `lambda` in the rebates function @@ -660,7 +592,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Set the delegation parameters for a particular indexer. + * @notice Set the delegation parameters for a particular indexer. * @param _indexer Indexer to set delegation parameters * @param _indexingRewardCut Percentage of indexing rewards left for delegators * @param _queryFeeCut Percentage of query fees left for delegators @@ -681,7 +613,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Stake tokens on the indexer. + * @notice Stake tokens on the indexer. * This function does not check minimum indexer stake requirement to allow * to be called by functions that increase the stake when collecting rewards * without reverting @@ -704,7 +636,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Withdraw indexer tokens once the thawing period has passed. + * @notice Withdraw indexer tokens once the thawing period has passed. * @param _indexer Address of indexer to withdraw funds from */ function _withdraw(address _indexer) private { @@ -719,7 +651,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Allocate available tokens to a subgraph deployment. + * @notice Allocate available tokens to a subgraph deployment. * @param _indexer Indexer address to allocate funds from. * @param _subgraphDeploymentID ID of the SubgraphDeployment where tokens will be allocated * @param _tokens Amount of tokens to allocate @@ -794,7 +726,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Close an allocation and free the staked tokens. + * @notice Close an allocation and free the staked tokens. * @param _allocationID The allocation identifier * @param _poi Proof of indexing submitted for the allocated period */ @@ -861,7 +793,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Collect the delegation rewards for query fees. + * @notice Collect the delegation rewards for query fees. * This function will assign the collected fees to the delegation pool. * @param _indexer Indexer to which the tokens to distribute are related * @param _tokens Total tokens received used to calculate the amount of fees to collect @@ -879,7 +811,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Collect the delegation rewards for indexing. + * @notice Collect the delegation rewards for indexing. * This function will assign the collected fees to the delegation pool. * @param _indexer Indexer to which the tokens to distribute are related * @param _tokens Total tokens received used to calculate the amount of fees to collect @@ -897,7 +829,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Collect the curation fees for a subgraph deployment from an amount of tokens. + * @notice Collect the curation fees for a subgraph deployment from an amount of tokens. * This function transfer curation fees to the Curation contract by calling Curation.collect * @param _graphToken Token to collect * @param _subgraphDeploymentID Subgraph deployment to which the curation fees are related @@ -926,7 +858,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M if (curationFees > 0) { // Transfer and call collect() // This function transfer tokens to a trusted protocol contracts - // Then we call collect() to do the transfer Bookkeeping + // Then we call collect() to do the transfer bookkeeping rewardsManager().onSubgraphSignalUpdate(_subgraphDeploymentID); TokenUtils.pushTokens(_graphToken, address(curation), curationFees); curation.collect(_subgraphDeploymentID, curationFees); @@ -937,7 +869,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Collect tax to burn for an amount of tokens. + * @notice Collect tax to burn for an amount of tokens. * @param _graphToken Token to burn * @param _tokens Total tokens received used to calculate the amount of tax to collect * @param _percentage Percentage of tokens to burn as tax @@ -953,7 +885,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Triggers an update of rewards due to a change in allocations. + * @notice Triggers an update of rewards due to a change in allocations. * @param _subgraphDeploymentID Subgraph deployment updated * @return Accumulated rewards per allocated token for the subgraph deployment */ @@ -966,7 +898,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Assign rewards for the closed allocation to indexer and delegators. + * @notice Assign rewards for the closed allocation to indexer and delegators. * @param _allocationID Allocation * @param _indexer Address of the indexer that did the allocation */ @@ -993,7 +925,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Send rewards to the appropriate destination. + * @notice Send rewards to the appropriate destination. * @param _graphToken Graph token * @param _amount Number of rewards tokens * @param _beneficiary Address of the beneficiary of rewards @@ -1013,7 +945,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Check if the caller is authorized to operate on behalf of + * @notice Check if the caller is authorized to operate on behalf of * an indexer (i.e. the caller is the indexer or an operator) * @param _indexer Indexer address * @return True if the caller is authorized to operate on behalf of the indexer @@ -1023,7 +955,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M } /** - * @dev Return the current state of an allocation + * @notice Return the current state of an allocation * @param _allocationID Allocation identifier * @return AllocationState enum with the state of the allocation */ diff --git a/packages/contracts/contracts/staking/StakingExtension.sol b/packages/contracts/contracts/staking/StakingExtension.sol index b06fbe894..fb8dea3e8 100644 --- a/packages/contracts/contracts/staking/StakingExtension.sol +++ b/packages/contracts/contracts/staking/StakingExtension.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { StakingV4Storage } from "./StakingStorage.sol"; import { IStakingExtension } from "./IStakingExtension.sol"; @@ -16,7 +19,8 @@ import { MathUtils } from "./libs/MathUtils.sol"; /** * @title StakingExtension contract - * @dev This contract provides the logic to manage delegations and other Staking + * @author Edge & Node + * @notice This contract provides the logic to manage delegations and other Staking * extension features (e.g. storage getters). It is meant to be called through delegatecall from the * Staking contract, and is only kept separate to keep the Staking contract size * within limits. @@ -44,12 +48,14 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi * initialize() function, so it uses the same access control check to ensure it is * being called by the Staking implementation as part of the proxy upgrade process. * @param _delegationUnbondingPeriod Delegation unbonding period in blocks + * @param _cooldownBlocks Deprecated parameter (no longer used) * @param _delegationRatio Delegation capacity multiplier (e.g. 10 means 10x the indexer stake) * @param _delegationTaxPercentage Percentage of delegated tokens to burn as delegation tax, expressed in parts per million */ function initialize( uint32 _delegationUnbondingPeriod, - uint32, //_cooldownBlocks, deprecated + // solhint-disable-next-line no-unused-vars + uint32 _cooldownBlocks, // deprecated uint32 _delegationRatio, uint32 _delegationTaxPercentage ) external onlyImpl { @@ -59,38 +65,28 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @notice Set a delegation tax percentage to burn when delegated funds are deposited. - * @dev This function is only callable by the governor - * @param _percentage Percentage of delegated tokens to burn as delegation tax, expressed in parts per million + * @inheritdoc IStakingExtension */ function setDelegationTaxPercentage(uint32 _percentage) external override onlyGovernor { _setDelegationTaxPercentage(_percentage); } /** - * @notice Set the delegation ratio. - * If set to 10 it means the indexer can use up to 10x the indexer staked amount - * from their delegated tokens - * @dev This function is only callable by the governor - * @param _delegationRatio Delegation capacity multiplier + * @inheritdoc IStakingExtension */ function setDelegationRatio(uint32 _delegationRatio) external override onlyGovernor { _setDelegationRatio(_delegationRatio); } /** - * @notice Set the time, in epochs, a Delegator needs to wait to withdraw tokens after undelegating. - * @dev This function is only callable by the governor - * @param _delegationUnbondingPeriod Period in epochs to wait for token withdrawals after undelegating + * @inheritdoc IStakingExtension */ function setDelegationUnbondingPeriod(uint32 _delegationUnbondingPeriod) external override onlyGovernor { _setDelegationUnbondingPeriod(_delegationUnbondingPeriod); } /** - * @notice Set or unset an address as allowed slasher. - * @param _slasher Address of the party allowed to slash indexers - * @param _allowed True if slasher is allowed + * @inheritdoc IStakingExtension */ function setSlasher(address _slasher, bool _allowed) external override onlyGovernor { require(_slasher != address(0), "!slasher"); @@ -99,10 +95,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @notice Delegate tokens to an indexer. - * @param _indexer Address of the indexer to which tokens are delegated - * @param _tokens Amount of tokens to delegate - * @return Amount of shares issued from the delegation pool + * @inheritdoc IStakingExtension */ function delegate(address _indexer, uint256 _tokens) external override notPartialPaused returns (uint256) { address delegator = msg.sender; @@ -115,32 +108,21 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @notice Undelegate tokens from an indexer. Tokens will be locked for the unbonding period. - * @param _indexer Address of the indexer to which tokens had been delegated - * @param _shares Amount of shares to return and undelegate tokens - * @return Amount of tokens returned for the shares of the delegation pool + * @inheritdoc IStakingExtension */ function undelegate(address _indexer, uint256 _shares) external override notPartialPaused returns (uint256) { return _undelegate(msg.sender, _indexer, _shares); } /** - * @notice Withdraw undelegated tokens once the unbonding period has passed, and optionally - * re-delegate to a new indexer. - * @param _indexer Withdraw available tokens delegated to indexer - * @param _newIndexer Re-delegate to indexer address if non-zero, withdraw if zero address + * @inheritdoc IStakingExtension */ function withdrawDelegated(address _indexer, address _newIndexer) external override notPaused returns (uint256) { return _withdrawDelegated(msg.sender, _indexer, _newIndexer); } /** - * @notice Slash the indexer stake. Delegated tokens are not subject to slashing. - * @dev Can only be called by the slasher role. - * @param _indexer Address of indexer to slash - * @param _tokens Amount of tokens to slash from the indexer stake - * @param _reward Amount of reward tokens to send to a beneficiary - * @param _beneficiary Address of a beneficiary to receive a reward for the slashing + * @inheritdoc IStakingExtension */ function slash( address _indexer, @@ -188,48 +170,35 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @notice Return the delegation from a delegator to an indexer. - * @param _indexer Address of the indexer where funds have been delegated - * @param _delegator Address of the delegator - * @return Delegation data + * @inheritdoc IStakingExtension */ function getDelegation(address _indexer, address _delegator) external view override returns (Delegation memory) { return __delegationPools[_indexer].delegators[_delegator]; } /** - * @notice Getter for the delegationRatio, i.e. the delegation capacity multiplier: - * If delegation ratio is 100, and an Indexer has staked 5 GRT, - * then they can use up to 500 GRT from the delegated stake - * @return Delegation ratio + * @inheritdoc IStakingExtension */ function delegationRatio() external view override returns (uint32) { return __delegationRatio; } /** - * @notice Getter for delegationUnbondingPeriod: - * Time in epochs a delegator needs to wait to withdraw delegated stake - * @return Delegation unbonding period in epochs + * @inheritdoc IStakingExtension */ function delegationUnbondingPeriod() external view override returns (uint32) { return __delegationUnbondingPeriod; } /** - * @notice Getter for delegationTaxPercentage: - * Percentage of tokens to tax a delegation deposit, expressed in parts per million - * @return Delegation tax percentage in parts per million + * @inheritdoc IStakingExtension */ function delegationTaxPercentage() external view override returns (uint32) { return __delegationTaxPercentage; } /** - * @notice Getter for delegationPools[_indexer]: - * gets the delegation pool structure for a particular indexer. - * @param _indexer Address of the indexer for which to query the delegation pool - * @return Delegation pool as a DelegationPoolReturn struct + * @inheritdoc IStakingExtension */ function delegationPools(address _indexer) external view override returns (DelegationPoolReturn memory) { DelegationPool storage pool = __delegationPools[_indexer]; @@ -245,120 +214,91 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @notice Getter for rewardsDestination[_indexer]: - * returns the address where the indexer's rewards are sent. - * @param _indexer The indexer address for which to query the rewards destination - * @return The address where the indexer's rewards are sent, zero if none is set in which case rewards are re-staked + * @inheritdoc IStakingExtension */ function rewardsDestination(address _indexer) external view override returns (address) { return __rewardsDestination[_indexer]; } /** - * @notice Getter for operatorAuth[_indexer][_maybeOperator]: - * returns true if the operator is authorized to operate on behalf of the indexer. - * @param _indexer The indexer address for which to query authorization - * @param _maybeOperator The address that may or may not be an operator - * @return True if the operator is authorized to operate on behalf of the indexer + * @inheritdoc IStakingExtension */ function operatorAuth(address _indexer, address _maybeOperator) external view override returns (bool) { return __operatorAuth[_indexer][_maybeOperator]; } /** - * @notice Getter for subgraphAllocations[_subgraphDeploymentId]: - * returns the amount of tokens allocated to a subgraph deployment. - * @param _subgraphDeploymentId The subgraph deployment for which to query the allocations - * @return The amount of tokens allocated to the subgraph deployment + * @inheritdoc IStakingExtension */ function subgraphAllocations(bytes32 _subgraphDeploymentId) external view override returns (uint256) { return __subgraphAllocations[_subgraphDeploymentId]; } /** - * @notice Getter for slashers[_maybeSlasher]: - * returns true if the address is a slasher, i.e. an entity that can slash indexers - * @param _maybeSlasher Address for which to check the slasher role - * @return True if the address is a slasher + * @inheritdoc IStakingExtension */ function slashers(address _maybeSlasher) external view override returns (bool) { return __slashers[_maybeSlasher]; } /** - * @notice Getter for minimumIndexerStake: the minimum - * amount of GRT that an indexer needs to stake. - * @return Minimum indexer stake in GRT + * @inheritdoc IStakingExtension */ function minimumIndexerStake() external view override returns (uint256) { return __minimumIndexerStake; } /** - * @notice Getter for thawingPeriod: the time in blocks an - * indexer needs to wait to unstake tokens. - * @return Thawing period in blocks + * @inheritdoc IStakingExtension */ function thawingPeriod() external view override returns (uint32) { return __thawingPeriod; } /** - * @notice Getter for curationPercentage: the percentage of - * query fees that are distributed to curators. - * @return Curation percentage in parts per million + * @inheritdoc IStakingExtension */ function curationPercentage() external view override returns (uint32) { return __curationPercentage; } /** - * @notice Getter for protocolPercentage: the percentage of - * query fees that are burned as protocol fees. - * @return Protocol percentage in parts per million + * @inheritdoc IStakingExtension */ function protocolPercentage() external view override returns (uint32) { return __protocolPercentage; } /** - * @notice Getter for maxAllocationEpochs: the maximum time in epochs - * that an allocation can be open before anyone is allowed to close it. This - * also caps the effective allocation when sending the allocation's query fees - * to the rebate pool. - * @return Maximum allocation period in epochs + * @inheritdoc IStakingExtension */ function maxAllocationEpochs() external view override returns (uint32) { return __maxAllocationEpochs; } /** - * @notice Getter for the numerator of the rebates alpha parameter - * @return Alpha numerator + * @inheritdoc IStakingExtension */ function alphaNumerator() external view override returns (uint32) { return __alphaNumerator; } /** - * @notice Getter for the denominator of the rebates alpha parameter - * @return Alpha denominator + * @inheritdoc IStakingExtension */ function alphaDenominator() external view override returns (uint32) { return __alphaDenominator; } /** - * @notice Getter for the numerator of the rebates lambda parameter - * @return Lambda numerator + * @inheritdoc IStakingExtension */ function lambdaNumerator() external view override returns (uint32) { return __lambdaNumerator; } /** - * @notice Getter for the denominator of the rebates lambda parameter - * @return Lambda denominator + * @inheritdoc IStakingExtension */ function lambdaDenominator() external view override returns (uint32) { return __lambdaDenominator; @@ -369,35 +309,28 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi * gets the stake information for an indexer as an IStakes.Indexer struct. * @param _indexer Indexer address for which to query the stake information * @return Stake information for the specified indexer, as an IStakes.Indexer struct + * @inheritdoc IStakingExtension */ function stakes(address _indexer) external view override returns (IStakes.Indexer memory) { return __stakes[_indexer]; } /** - * @notice Getter for allocations[_allocationID]: - * gets an allocation's information as an IStakingData.Allocation struct. - * @param _allocationID Allocation ID for which to query the allocation information - * @return The specified allocation, as an IStakingData.Allocation struct + * @inheritdoc IStakingExtension */ function allocations(address _allocationID) external view override returns (IStakingData.Allocation memory) { return __allocations[_allocationID]; } /** - * @notice Return whether the delegator has delegated to the indexer. - * @param _indexer Address of the indexer where funds have been delegated - * @param _delegator Address of the delegator - * @return True if delegator has tokens delegated to the indexer + * @inheritdoc IStakingExtension */ function isDelegator(address _indexer, address _delegator) public view override returns (bool) { return __delegationPools[_indexer].delegators[_delegator].shares > 0; } /** - * @notice Returns amount of delegated tokens ready to be withdrawn after unbonding period. - * @param _delegation Delegation of tokens from delegator to indexer - * @return Amount of tokens to withdraw + * @inheritdoc IStakingExtension */ function getWithdraweableDelegatedTokens(Delegation memory _delegation) public view override returns (uint256) { // There must be locked tokens and period passed @@ -409,7 +342,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Internal: Set a delegation tax percentage to burn when delegated funds are deposited. + * @notice Internal: Set a delegation tax percentage to burn when delegated funds are deposited. * @param _percentage Percentage of delegated tokens to burn as delegation tax */ function _setDelegationTaxPercentage(uint32 _percentage) private { @@ -420,7 +353,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Internal: Set the delegation ratio. + * @notice Internal: Set the delegation ratio. * If set to 10 it means the indexer can use up to 10x the indexer staked amount * from their delegated tokens * @param _delegationRatio Delegation capacity multiplier @@ -431,7 +364,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Internal: Set the period for undelegation of stake from indexer. + * @notice Internal: Set the period for undelegation of stake from indexer. * @param _delegationUnbondingPeriod Period in epochs to wait for token withdrawals after undelegating */ function _setDelegationUnbondingPeriod(uint32 _delegationUnbondingPeriod) private { @@ -441,7 +374,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Delegate tokens to an indexer. + * @notice Delegate tokens to an indexer. * @param _delegator Address of the delegator * @param _indexer Address of the indexer to delegate tokens to * @param _tokens Amount of tokens to delegate @@ -480,7 +413,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Undelegate tokens from an indexer. + * @notice Undelegate tokens from an indexer. * @param _delegator Address of the delegator * @param _indexer Address of the indexer where tokens had been delegated * @param _shares Amount of shares to return and undelegate tokens @@ -531,7 +464,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Withdraw delegated tokens once the unbonding period has passed. + * @notice Withdraw delegated tokens once the unbonding period has passed. * @param _delegator Delegator that is withdrawing tokens * @param _indexer Withdraw available tokens delegated to indexer * @param _delegateToIndexer Re-delegate to indexer address if non-zero, withdraw if zero address @@ -570,7 +503,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** - * @dev Collect tax to burn for an amount of tokens. + * @notice Collect tax to burn for an amount of tokens. * @param _graphToken Token to burn * @param _tokens Total tokens received used to calculate the amount of tax to collect * @param _percentage Percentage of tokens to burn as tax diff --git a/packages/contracts/contracts/staking/StakingStorage.sol b/packages/contracts/contracts/staking/StakingStorage.sol index 949a63614..221359b50 100644 --- a/packages/contracts/contracts/staking/StakingStorage.sol +++ b/packages/contracts/contracts/staking/StakingStorage.sol @@ -1,7 +1,12 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// solhint-disable one-contract-per-file pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable one-contract-per-file, max-states-count +// solhint-disable named-parameters-mapping + import { Managed } from "../governance/Managed.sol"; import { IStakingData } from "./IStakingData.sol"; @@ -9,11 +14,11 @@ import { IStakes } from "./libs/IStakes.sol"; /** * @title StakingV1Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the Staking contract, version 1 * @dev Note that we use a double underscore prefix for variable names; this prefix identifies * variables that used to be public but are now internal, getters can be found on StakingExtension.sol. */ -// solhint-disable-next-line max-states-count contract StakingV1Storage is Managed { // -- Staking -- @@ -54,7 +59,7 @@ contract StakingV1Storage is Managed { /// @dev Subgraph Allocations: subgraphDeploymentID => tokens mapping(bytes32 => uint256) internal __subgraphAllocations; - // Rebate pools : epoch => Pool + /// @dev Deprecated rebate pools mapping (no longer used) mapping(uint256 => uint256) private __DEPRECATED_rebates; // solhint-disable-line var-name-mixedcase // -- Slashing -- @@ -95,6 +100,7 @@ contract StakingV1Storage is Managed { /** * @title StakingV2Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the Staking contract, version 2 * @dev Note that we use a double underscore prefix for variable names; this prefix identifies * variables that used to be public but are now internal, getters can be found on StakingExtension.sol. @@ -106,6 +112,7 @@ contract StakingV2Storage is StakingV1Storage { /** * @title StakingV3Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the base Staking contract, version 3. */ contract StakingV3Storage is StakingV2Storage { @@ -117,13 +124,15 @@ contract StakingV3Storage is StakingV2Storage { /** * @title StakingV4Storage + * @author Edge & Node * @notice This contract holds all the storage variables for the base Staking contract, version 4. * @dev Note that it includes a storage gap - if adding future versions, make sure to move the gap * to the new version and reduce the size of the gap accordingly. */ contract StakingV4Storage is StakingV3Storage { - // Additional rebate parameters for exponential rebates + /// @dev Numerator for the lambda parameter in exponential rebate calculations uint32 internal __lambdaNumerator; + /// @dev Denominator for the lambda parameter in exponential rebate calculations uint32 internal __lambdaDenominator; /// @dev Gap to allow adding variables in future upgrades (since L1Staking and L2Staking can have their own storage as well) diff --git a/packages/contracts/contracts/staking/libs/Exponential.sol b/packages/contracts/contracts/staking/libs/Exponential.sol index c9370342e..2b0222daa 100644 --- a/packages/contracts/contracts/staking/libs/Exponential.sol +++ b/packages/contracts/contracts/staking/libs/Exponential.sol @@ -6,13 +6,14 @@ import { LibFixedMath } from "./LibFixedMath.sol"; /** * @title LibExponential library + * @author Edge & Node * @notice A library to compute query fee rebates using an exponential formula */ library LibExponential { /// @dev Maximum value of the exponent for which to compute the exponential before clamping to zero. uint32 private constant MAX_EXPONENT = 15; - /// @dev The exponential formula used to compute fee-based rewards for + /// @notice The exponential formula used to compute fee-based rewards for /// staking pools in a given epoch. This function does not perform /// bounds checking on the inputs, but the following conditions /// need to be true: diff --git a/packages/contracts/contracts/staking/libs/IStakes.sol b/packages/contracts/contracts/staking/libs/IStakes.sol index 701336409..10364ebad 100644 --- a/packages/contracts/contracts/staking/libs/IStakes.sol +++ b/packages/contracts/contracts/staking/libs/IStakes.sol @@ -3,6 +3,11 @@ pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +/** + * @title Interface for staking data structures + * @author Edge & Node + * @notice Defines the data structures used for indexer staking + */ interface IStakes { struct Indexer { uint256 tokensStaked; // Tokens on the indexer stake (staked by the indexer) diff --git a/packages/contracts/contracts/staking/libs/LibFixedMath.sol b/packages/contracts/contracts/staking/libs/LibFixedMath.sol index ae8c9b69e..55628ea6e 100644 --- a/packages/contracts/contracts/staking/libs/LibFixedMath.sol +++ b/packages/contracts/contracts/staking/libs/LibFixedMath.sol @@ -20,36 +20,49 @@ pragma solidity ^0.7.6; -// solhint-disable indent -/// @dev Signed, fixed-point, 127-bit precision math library. +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines, gas-strict-inequalities + +/** + * @title LibFixedMath + * @author Edge & Node + * @notice Signed, fixed-point, 127-bit precision math library + */ library LibFixedMath { - // 1 + /// @dev Fixed-point representation of 1 int256 private constant FIXED_1 = int256(0x0000000000000000000000000000000080000000000000000000000000000000); - // 2**255 + /// @dev Minimum fixed-point value (2**255) int256 private constant MIN_FIXED_VAL = int256(0x8000000000000000000000000000000000000000000000000000000000000000); - // 1^2 (in fixed-point) + /// @dev Fixed-point representation of 1^2 int256 private constant FIXED_1_SQUARED = int256(0x4000000000000000000000000000000000000000000000000000000000000000); - // 1 + /// @dev Maximum value for natural logarithm calculation int256 private constant LN_MAX_VAL = FIXED_1; - // e ^ -63.875 + /// @dev Minimum value for natural logarithm calculation (e ^ -63.875) int256 private constant LN_MIN_VAL = int256(0x0000000000000000000000000000000000000000000000000000000733048c5a); - // 0 + /// @dev Maximum value for exponentiation calculation int256 private constant EXP_MAX_VAL = 0; - // -63.875 + /// @dev Minimum value for exponentiation calculation (-63.875) int256 private constant EXP_MIN_VAL = -int256(0x0000000000000000000000000000001ff0000000000000000000000000000000); - /// @dev Get one as a fixed-point number. + /// @notice Get one as a fixed-point number. + /// @return f The fixed-point representation of 1 function one() internal pure returns (int256 f) { f = FIXED_1; } - /// @dev Returns the addition of two fixed point numbers, reverting on overflow. + /// @notice Returns the addition of two fixed point numbers, reverting on overflow. + /// @param a First fixed-point number + /// @param b Second fixed-point number + /// @return c The sum of a and b function add(int256 a, int256 b) internal pure returns (int256 c) { c = _add(a, b); } - /// @dev Returns the addition of two fixed point numbers, reverting on overflow. + /// @notice Returns the subtraction of two fixed point numbers, reverting on overflow. + /// @param a First fixed-point number + /// @param b Second fixed-point number + /// @return c The difference a - b function sub(int256 a, int256 b) internal pure returns (int256 c) { if (b == MIN_FIXED_VAL) { revert("out-of-bounds"); @@ -57,24 +70,37 @@ library LibFixedMath { c = _add(a, -b); } - /// @dev Returns the multiplication of two fixed point numbers, reverting on overflow. + /// @notice Returns the multiplication of two fixed point numbers, reverting on overflow. + /// @param a First fixed-point number + /// @param b Second fixed-point number + /// @return c The product of a and b function mul(int256 a, int256 b) internal pure returns (int256 c) { c = _mul(a, b) / FIXED_1; } - /// @dev Returns the division of two fixed point numbers. + /// @notice Returns the division of two fixed point numbers. + /// @param a Dividend fixed-point number + /// @param b Divisor fixed-point number + /// @return c The quotient a / b function div(int256 a, int256 b) internal pure returns (int256 c) { c = _div(_mul(a, FIXED_1), b); } - /// @dev Performs (a * n) / d, without scaling for precision. + /// @notice Performs (a * n) / d, without scaling for precision. + /// @param a First operand + /// @param n Numerator + /// @param d Denominator + /// @return c The result of (a * n) / d function mulDiv(int256 a, int256 n, int256 d) internal pure returns (int256 c) { c = _div(_mul(a, n), d); } - /// @dev Returns the unsigned integer result of multiplying a fixed-point + /// @notice Returns the unsigned integer result of multiplying a fixed-point /// number with an integer, reverting if the multiplication overflows. /// Negative results are clamped to zero. + /// @param f Fixed-point number + /// @param u Unsigned integer + /// @return The result of f * u as an unsigned integer function uintMul(int256 f, uint256 u) internal pure returns (uint256) { if (int256(u) < int256(0)) { revert("out-of-bounds"); @@ -86,7 +112,9 @@ library LibFixedMath { return uint256(uint256(c) >> 127); } - /// @dev Returns the absolute value of a fixed point number. + /// @notice Returns the absolute value of a fixed point number. + /// @param f Fixed-point number + /// @return c The absolute value of f function abs(int256 f) internal pure returns (int256 c) { if (f == MIN_FIXED_VAL) { revert("out-of-bounds"); @@ -98,23 +126,32 @@ library LibFixedMath { } } - /// @dev Returns 1 / `x`, where `x` is a fixed-point number. + /// @notice Returns 1 / `x`, where `x` is a fixed-point number. + /// @param f Fixed-point number to invert + /// @return c The reciprocal of f function invert(int256 f) internal pure returns (int256 c) { c = _div(FIXED_1_SQUARED, f); } - /// @dev Convert signed `n` / 1 to a fixed-point number. + /// @notice Convert signed `n` / 1 to a fixed-point number. + /// @param n Signed integer to convert + /// @return f The fixed-point representation of n function toFixed(int256 n) internal pure returns (int256 f) { f = _mul(n, FIXED_1); } - /// @dev Convert signed `n` / `d` to a fixed-point number. + /// @notice Convert signed `n` / `d` to a fixed-point number. + /// @param n Numerator + /// @param d Denominator + /// @return f The fixed-point representation of n/d function toFixed(int256 n, int256 d) internal pure returns (int256 f) { f = _div(_mul(n, FIXED_1), d); } - /// @dev Convert unsigned `n` / 1 to a fixed-point number. + /// @notice Convert unsigned `n` / 1 to a fixed-point number. /// Reverts if `n` is too large to fit in a fixed-point number. + /// @param n Unsigned integer to convert + /// @return f The fixed-point representation of n function toFixed(uint256 n) internal pure returns (int256 f) { if (int256(n) < int256(0)) { revert("out-of-bounds"); @@ -122,8 +159,11 @@ library LibFixedMath { f = _mul(int256(n), FIXED_1); } - /// @dev Convert unsigned `n` / `d` to a fixed-point number. + /// @notice Convert unsigned `n` / `d` to a fixed-point number. /// Reverts if `n` / `d` is too large to fit in a fixed-point number. + /// @param n Numerator + /// @param d Denominator + /// @return f The fixed-point representation of n/d function toFixed(uint256 n, uint256 d) internal pure returns (int256 f) { if (int256(n) < int256(0)) { revert("out-of-bounds"); @@ -134,12 +174,16 @@ library LibFixedMath { f = _div(_mul(int256(n), FIXED_1), int256(d)); } - /// @dev Convert a fixed-point number to an integer. + /// @notice Convert a fixed-point number to an integer. + /// @param f Fixed-point number to convert + /// @return n The integer representation of f function toInteger(int256 f) internal pure returns (int256 n) { return f / FIXED_1; } - /// @dev Get the natural logarithm of a fixed-point number 0 < `x` <= LN_MAX_VAL + /// @notice Get the natural logarithm of a fixed-point number 0 < `x` <= LN_MAX_VAL + /// @param x Fixed-point number to compute logarithm of + /// @return r The natural logarithm of x function ln(int256 x) internal pure returns (int256 r) { if (x > LN_MAX_VAL) { revert("out-of-bounds"); @@ -228,7 +272,9 @@ library LibFixedMath { r += (z * (0x088888888888888888888888888888888 - y)) / 0x800000000000000000000000000000000; // add y^15 / 15 - y^16 / 16 } - /// @dev Compute the natural exponent for a fixed-point number EXP_MIN_VAL <= `x` <= 1 + /// @notice Compute the natural exponent for a fixed-point number EXP_MIN_VAL <= `x` <= 1 + /// @param x Fixed-point number to compute exponent of + /// @return r The natural exponent of x function exp(int256 x) internal pure returns (int256 r) { if (x < EXP_MIN_VAL) { // Saturate to zero below EXP_MIN_VAL. @@ -350,7 +396,10 @@ library LibFixedMath { } } - /// @dev Returns the multiplication two numbers, reverting on overflow. + /// @notice Returns the multiplication two numbers, reverting on overflow. + /// @param a First operand + /// @param b Second operand + /// @return c The product of a and b function _mul(int256 a, int256 b) private pure returns (int256 c) { if (a == 0 || b == 0) { return 0; @@ -361,7 +410,10 @@ library LibFixedMath { } } - /// @dev Returns the division of two numbers, reverting on division by zero. + /// @notice Returns the division of two numbers, reverting on division by zero. + /// @param a Dividend + /// @param b Divisor + /// @return c The quotient of a and b function _div(int256 a, int256 b) private pure returns (int256 c) { if (b == 0) { revert("overflow"); @@ -372,7 +424,10 @@ library LibFixedMath { c = a / b; } - /// @dev Adds two numbers, reverting on overflow. + /// @notice Adds two numbers, reverting on overflow. + /// @param a First operand + /// @param b Second operand + /// @return c The sum of a and b function _add(int256 a, int256 b) private pure returns (int256 c) { c = a + b; if ((a < 0 && b < 0 && c > a) || (a > 0 && b > 0 && c < a)) { diff --git a/packages/contracts/contracts/staking/libs/MathUtils.sol b/packages/contracts/contracts/staking/libs/MathUtils.sol index 0fb20389a..467e1ae2a 100644 --- a/packages/contracts/contracts/staking/libs/MathUtils.sol +++ b/packages/contracts/contracts/staking/libs/MathUtils.sol @@ -2,17 +2,21 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts/math/SafeMath.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; /** * @title MathUtils Library + * @author Edge & Node * @notice A collection of functions to perform math operations */ library MathUtils { using SafeMath for uint256; /** - * @dev Calculates the weighted average of two values pondering each of these + * @notice Calculates the weighted average of two values pondering each of these * values based on configured weights. The contribution of each value N is * weightN/(weightA + weightB). The calculation rounds up to ensure the result * is always greater than the smallest of the two values. @@ -20,6 +24,7 @@ library MathUtils { * @param weightA The weight to use for value A * @param valueB The amount for value B * @param weightB The weight to use for value B + * @return The weighted average of the two values, rounded up */ function weightedAverageRoundingUp( uint256 valueA, @@ -31,14 +36,20 @@ library MathUtils { } /** - * @dev Returns the minimum of two numbers. + * @notice Returns the minimum of two numbers. + * @param x First number + * @param y Second number + * @return The smaller of the two numbers */ function min(uint256 x, uint256 y) internal pure returns (uint256) { return x <= y ? x : y; } /** - * @dev Returns the difference between two numbers or zero if negative. + * @notice Returns the difference between two numbers or zero if negative. + * @param x First number + * @param y Second number + * @return The difference x - y, or 0 if y > x */ function diffOrZero(uint256 x, uint256 y) internal pure returns (uint256) { return (x > y) ? x.sub(y) : 0; diff --git a/packages/contracts/contracts/staking/libs/Stakes.sol b/packages/contracts/contracts/staking/libs/Stakes.sol index b09101032..175e0bc21 100644 --- a/packages/contracts/contracts/staking/libs/Stakes.sol +++ b/packages/contracts/contracts/staking/libs/Stakes.sol @@ -3,13 +3,15 @@ pragma solidity ^0.7.6; pragma abicoder v2; -import "@openzeppelin/contracts/math/SafeMath.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import "./MathUtils.sol"; -import "./IStakes.sol"; +import { MathUtils } from "./MathUtils.sol"; +import { IStakes } from "./IStakes.sol"; /** * @title A collection of data structures and functions to manage the Indexer Stake state. + * @author Edge & Node + * @notice A collection of data structures and functions to manage the Indexer Stake state. * Used for low-level state changes, require() conditions should be evaluated * at the caller function scope. */ @@ -18,7 +20,7 @@ library Stakes { using Stakes for IStakes.Indexer; /** - * @dev Deposit tokens to the indexer stake. + * @notice Deposit tokens to the indexer stake. * @param stake Stake data * @param _tokens Amount of tokens to deposit */ @@ -27,7 +29,7 @@ library Stakes { } /** - * @dev Release tokens from the indexer stake. + * @notice Release tokens from the indexer stake. * @param stake Stake data * @param _tokens Amount of tokens to release */ @@ -36,7 +38,7 @@ library Stakes { } /** - * @dev Allocate tokens from the main stack to a SubgraphDeployment. + * @notice Allocate tokens from the main stack to a SubgraphDeployment. * @param stake Stake data * @param _tokens Amount of tokens to allocate */ @@ -45,7 +47,7 @@ library Stakes { } /** - * @dev Unallocate tokens from a SubgraphDeployment back to the main stack. + * @notice Unallocate tokens from a SubgraphDeployment back to the main stack. * @param stake Stake data * @param _tokens Amount of tokens to unallocate */ @@ -54,7 +56,7 @@ library Stakes { } /** - * @dev Lock tokens until a thawing period pass. + * @notice Lock tokens until a thawing period pass. * @param stake Stake data * @param _tokens Amount of tokens to unstake * @param _period Period in blocks that need to pass before withdrawal @@ -77,7 +79,7 @@ library Stakes { } /** - * @dev Unlock tokens. + * @notice Unlock tokens. * @param stake Stake data * @param _tokens Amount of tokens to unlock */ @@ -89,7 +91,7 @@ library Stakes { } /** - * @dev Take all tokens out from the locked stake for withdrawal. + * @notice Take all tokens out from the locked stake for withdrawal. * @param stake Stake data * @return Amount of tokens being withdrawn */ @@ -109,7 +111,7 @@ library Stakes { } /** - * @dev Return the amount of tokens used in allocations and locked for withdrawal. + * @notice Return the amount of tokens used in allocations and locked for withdrawal. * @param stake Stake data * @return Token amount */ @@ -118,7 +120,7 @@ library Stakes { } /** - * @dev Return the amount of tokens staked not considering the ones that are already going + * @notice Return the amount of tokens staked not considering the ones that are already going * through the thawing period or are ready for withdrawal. We call it secure stake because * it is not subject to change by a withdraw call from the indexer. * @param stake Stake data @@ -129,7 +131,7 @@ library Stakes { } /** - * @dev Tokens free balance on the indexer stake that can be used for any purpose. + * @notice Tokens free balance on the indexer stake that can be used for any purpose. * Any token that is allocated cannot be used as well as tokens that are going through the * thawing period or are withdrawable * Calc: tokensStaked - tokensAllocated - tokensLocked @@ -141,7 +143,7 @@ library Stakes { } /** - * @dev Tokens free balance on the indexer stake that can be used for allocations. + * @notice Tokens free balance on the indexer stake that can be used for allocations. * This function accepts a parameter for extra delegated capacity that takes into * account delegated tokens * @param stake Stake data @@ -171,7 +173,7 @@ library Stakes { } /** - * @dev Tokens available for withdrawal after thawing period. + * @notice Tokens available for withdrawal after thawing period. * @param stake Stake data * @return Token amount */ diff --git a/packages/contracts/contracts/tests/CallhookReceiverMock.sol b/packages/contracts/contracts/tests/CallhookReceiverMock.sol index e2418f3c8..b87d57cf0 100644 --- a/packages/contracts/contracts/tests/CallhookReceiverMock.sol +++ b/packages/contracts/contracts/tests/CallhookReceiverMock.sol @@ -2,21 +2,29 @@ pragma solidity ^0.7.6; -import "../gateway/ICallhookReceiver.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, use-natspec + +import { ICallhookReceiver } from "../gateway/ICallhookReceiver.sol"; /** - * @title GovernedMock contract + * @title CallhookReceiverMock contract + * @dev Mock contract for testing callhook receiver functionality */ contract CallhookReceiverMock is ICallhookReceiver { + /** + * @dev Emitted when a transfer is received + * @param from Address that sent the transfer + * @param amount Amount of tokens transferred + * @param foo First test parameter + * @param bar Second test parameter + */ event TransferReceived(address from, uint256 amount, uint256 foo, uint256 bar); /** - * @dev Receive tokens with a callhook from the bridge - * Expects two uint256 values encoded in _data. + * @inheritdoc ICallhookReceiver + * @dev Expects two uint256 values encoded in _data. * Reverts if the first of these values is zero. - * @param _from Token sender in L1 - * @param _amount Amount of tokens that were transferred - * @param _data ABI-encoded callhook data */ function onTokenTransfer(address _from, uint256 _amount, bytes calldata _data) external override { uint256 foo; diff --git a/packages/contracts/contracts/tests/GovernedMock.sol b/packages/contracts/contracts/tests/GovernedMock.sol index cc908287b..9e6c2cc18 100644 --- a/packages/contracts/contracts/tests/GovernedMock.sol +++ b/packages/contracts/contracts/tests/GovernedMock.sol @@ -2,12 +2,19 @@ pragma solidity ^0.7.6; -import "../governance/Governed.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { Governed } from "../governance/Governed.sol"; /** * @title GovernedMock contract + * @dev Mock contract for testing Governed functionality */ contract GovernedMock is Governed { + /** + * @dev Constructor that initializes the contract with the deployer as governor + */ constructor() { Governed._initialize(msg.sender); } diff --git a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolBadMock.sol b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolBadMock.sol index f540b1b96..12b06b332 100644 --- a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolBadMock.sol +++ b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolBadMock.sol @@ -3,17 +3,37 @@ pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; +// solhint-disable named-parameters-mapping +// solhint-disable gas-small-strings + +/** + * @title L1GraphTokenLockTransferToolBadMock + * @author Edge & Node + * @notice Mock contract for testing L1 Graph Token Lock Transfer Tool with bad behavior + */ contract L1GraphTokenLockTransferToolBadMock { + /** + * @notice Mapping from L1 wallet address to L2 wallet address + */ mapping(address => address) public l2WalletAddress; - function setL2WalletAddress(address _l1Address, address _l2Address) external { - l2WalletAddress[_l1Address] = _l2Address; + /** + * @notice Set the L2 wallet address for an L1 wallet + * @param l1Address L1 wallet address + * @param l2Address L2 wallet address + */ + function setL2WalletAddress(address l1Address, address l2Address) external { + l2WalletAddress[l1Address] = l2Address; } - // Sends 1 wei less than requested - function pullETH(address _l1Wallet, uint256 _amount) external { - require(l2WalletAddress[_l1Wallet] != address(0), "L1GraphTokenLockTransferToolMock: unknown L1 wallet"); - (bool success, ) = payable(msg.sender).call{ value: _amount - 1 }(""); + /** + * @notice Pull ETH from the contract to the caller (sends 1 wei less than requested for testing) + * @param l1Wallet L1 wallet address to check + * @param amount Amount of ETH to pull + */ + function pullETH(address l1Wallet, uint256 amount) external { + require(l2WalletAddress[l1Wallet] != address(0), "L1GraphTokenLockTransferToolMock: unknown L1 wallet"); + (bool success, ) = payable(msg.sender).call{ value: amount - 1 }(""); require(success, "L1GraphTokenLockTransferToolMock: ETH pull failed"); } } diff --git a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol index a1321d62f..92e8f73f7 100644 --- a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol +++ b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol @@ -3,16 +3,37 @@ pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; +// solhint-disable named-parameters-mapping +// solhint-disable gas-small-strings + +/** + * @title L1GraphTokenLockTransferToolMock + * @author Edge & Node + * @notice Mock contract for testing L1 Graph Token Lock Transfer Tool functionality + */ contract L1GraphTokenLockTransferToolMock { + /** + * @notice Mapping from L1 wallet address to L2 wallet address + */ mapping(address => address) public l2WalletAddress; - function setL2WalletAddress(address _l1Address, address _l2Address) external { - l2WalletAddress[_l1Address] = _l2Address; + /** + * @notice Set the L2 wallet address for an L1 wallet + * @param l1Address L1 wallet address + * @param l2Address L2 wallet address + */ + function setL2WalletAddress(address l1Address, address l2Address) external { + l2WalletAddress[l1Address] = l2Address; } - function pullETH(address _l1Wallet, uint256 _amount) external { - require(l2WalletAddress[_l1Wallet] != address(0), "L1GraphTokenLockTransferToolMock: unknown L1 wallet"); - (bool success, ) = payable(msg.sender).call{ value: _amount }(""); + /** + * @notice Pull ETH from the contract to the caller + * @param l1Wallet L1 wallet address to check + * @param amount Amount of ETH to pull + */ + function pullETH(address l1Wallet, uint256 amount) external { + require(l2WalletAddress[l1Wallet] != address(0), "L1GraphTokenLockTransferToolMock: unknown L1 wallet"); + (bool success, ) = payable(msg.sender).call{ value: amount }(""); require(success, "L1GraphTokenLockTransferToolMock: ETH pull failed"); } } diff --git a/packages/contracts/contracts/tests/LegacyGNSMock.sol b/packages/contracts/contracts/tests/LegacyGNSMock.sol index b2b4088b9..30e619e6e 100644 --- a/packages/contracts/contracts/tests/LegacyGNSMock.sol +++ b/packages/contracts/contracts/tests/LegacyGNSMock.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.6; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + import { L1GNS } from "../discovery/L1GNS.sol"; import { IGNS } from "../discovery/IGNS.sol"; diff --git a/packages/contracts/contracts/tests/MockERC165OnlyContract.sol b/packages/contracts/contracts/tests/MockERC165OnlyContract.sol new file mode 100644 index 000000000..5adace380 --- /dev/null +++ b/packages/contracts/contracts/tests/MockERC165OnlyContract.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.7.6; + +import { ERC165 } from "@openzeppelin/contracts/introspection/ERC165.sol"; + +/** + * @title MockERC165OnlyContract + * @author Edge & Node + * @notice A mock contract that supports ERC-165 but not IRewardsEligibilityOracle + * @dev Used for testing ERC-165 interface checking in RewardsManager + */ +contract MockERC165OnlyContract is ERC165 { + /** + * @notice A dummy function to make this a non-trivial contract + * @return A dummy string + */ + function dummyFunction() external pure returns (string memory) { + return "This contract only supports ERC-165"; + } +} diff --git a/packages/contracts/contracts/tests/arbitrum/ArbSysMock.sol b/packages/contracts/contracts/tests/arbitrum/ArbSysMock.sol index b5af6114e..3c256fa74 100644 --- a/packages/contracts/contracts/tests/arbitrum/ArbSysMock.sol +++ b/packages/contracts/contracts/tests/arbitrum/ArbSysMock.sol @@ -2,12 +2,22 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + /** * @title ArbSys Mock Contract * @dev This is a mock implementation of the ArbSys precompiled contract used in Arbitrum * It's used for testing the L2GraphTokenGateway contract */ contract ArbSysMock { + /** + * @dev Emitted when a transaction is sent from L2 to L1 + * @param from Address sending the transaction on L2 + * @param to Address receiving the transaction on L1 + * @param id Unique identifier for the L2-to-L1 transaction + * @param data Transaction data + */ event L2ToL1Tx(address indexed from, address indexed to, uint256 indexed id, bytes data); /** diff --git a/packages/contracts/contracts/tests/arbitrum/BridgeMock.sol b/packages/contracts/contracts/tests/arbitrum/BridgeMock.sol index 77be89b4e..141cf2dda 100644 --- a/packages/contracts/contracts/tests/arbitrum/BridgeMock.sol +++ b/packages/contracts/contracts/tests/arbitrum/BridgeMock.sol @@ -2,29 +2,35 @@ pragma solidity ^0.7.6; -import "../../arbitrum/IBridge.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one, use-natspec + +import { IBridge } from "../../arbitrum/IBridge.sol"; /** * @title Arbitrum Bridge mock contract * @dev This contract implements Arbitrum's IBridge interface for testing purposes */ contract BridgeMock is IBridge { - // Address of the (mock) Arbitrum Inbox + /** + * @notice Address of the (mock) Arbitrum Inbox + */ address public inbox; - // Address of the (mock) Arbitrum Outbox + /** + * @notice Address of the (mock) Arbitrum Outbox + */ address public outbox; - // Index of the next message on the inbox messages array + /** + * @notice Index of the next message on the inbox messages array + */ uint256 public messageIndex; - // Inbox messages array + /** + * @inheritdoc IBridge + */ bytes32[] public override inboxAccs; /** - * @dev Deliver a message to the inbox. The encoded message will be - * added to the inbox array, and messageIndex will be incremented. - * @param _kind Type of the message - * @param _sender Address that is sending the message - * @param _messageDataHash keccak256 hash of the message data - * @return The next index for the inbox array + * @inheritdoc IBridge */ function deliverMessageToInbox( uint8 _kind, @@ -38,13 +44,7 @@ contract BridgeMock is IBridge { } /** - * @dev Executes an L1 function call incoing from L2. This can only be called - * by the Outbox. - * @param _destAddr Contract to call - * @param _amount ETH value to send - * @param _data Calldata for the function call - * @return True if the call was successful, false otherwise - * @return Return data from the call + * @inheritdoc IBridge */ function executeCall( address _destAddr, @@ -62,9 +62,7 @@ contract BridgeMock is IBridge { } /** - * @dev Set the address of the inbox. Anyone can call this, because it's a mock. - * @param _inbox Address of the inbox - * @param _enabled Enable the inbox (ignored) + * @inheritdoc IBridge */ function setInbox(address _inbox, bool _enabled) external override { inbox = _inbox; @@ -72,9 +70,7 @@ contract BridgeMock is IBridge { } /** - * @dev Set the address of the outbox. Anyone can call this, because it's a mock. - * @param _outbox Address of the outbox - * @param _enabled Enable the outbox (ignored) + * @inheritdoc IBridge */ function setOutbox(address _outbox, bool _enabled) external override { outbox = _outbox; @@ -84,33 +80,28 @@ contract BridgeMock is IBridge { // View functions /** - * @dev Getter for the active outbox (in this case there's only one) + * @inheritdoc IBridge */ function activeOutbox() external view override returns (address) { return outbox; } /** - * @dev Getter for whether an address is an allowed inbox (in this case there's only one) - * @param _inbox Address to check - * @return True if the address is the allowed inbox, false otherwise + * @inheritdoc IBridge */ function allowedInboxes(address _inbox) external view override returns (bool) { return _inbox == inbox; } /** - * @dev Getter for whether an address is an allowed outbox (in this case there's only one) - * @param _outbox Address to check - * @return True if the address is the allowed outbox, false otherwise + * @inheritdoc IBridge */ function allowedOutboxes(address _outbox) external view override returns (bool) { return _outbox == outbox; } /** - * @dev Getter for the count of messages in the inboxAccs - * @return Number of messages in inboxAccs + * @inheritdoc IBridge */ function messageCount() external view override returns (uint256) { return inboxAccs.length; diff --git a/packages/contracts/contracts/tests/arbitrum/InboxMock.sol b/packages/contracts/contracts/tests/arbitrum/InboxMock.sol index 57af6941c..c920ea314 100644 --- a/packages/contracts/contracts/tests/arbitrum/InboxMock.sol +++ b/packages/contracts/contracts/tests/arbitrum/InboxMock.sol @@ -2,26 +2,28 @@ pragma solidity ^0.7.6; -import "../../arbitrum/IInbox.sol"; -import "../../arbitrum/AddressAliasHelper.sol"; +import { IInbox } from "../../arbitrum/IInbox.sol"; +import { AddressAliasHelper } from "../../arbitrum/AddressAliasHelper.sol"; +import { IBridge } from "../../arbitrum/IBridge.sol"; /** * @title Arbitrum Inbox mock contract - * @dev This contract implements (a subset of) Arbitrum's IInbox interface for testing purposes + * @author Edge & Node + * @notice This contract implements (a subset of) Arbitrum's IInbox interface for testing purposes */ contract InboxMock is IInbox { - // Type indicator for a standard L2 message + /// @dev Type indicator for a standard L2 message uint8 internal constant L2_MSG = 3; - // Type indicator for a retryable ticket message + /// @dev Type indicator for a retryable ticket message // solhint-disable-next-line const-name-snakecase uint8 internal constant L1MessageType_submitRetryableTx = 9; - // Address of the Bridge (mock) contract + /** + * @inheritdoc IInbox + */ IBridge public override bridge; /** - * @dev Send a message to L2 (by delivering it to the Bridge) - * @param _messageData Encoded data to send in the message - * @return message number returned by the inbox + * @inheritdoc IInbox */ function sendL2Message(bytes calldata _messageData) external override returns (uint256) { uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(_messageData)); @@ -30,7 +32,7 @@ contract InboxMock is IInbox { } /** - * @dev Set the address of the (mock) bridge + * @notice Set the address of the (mock) bridge * @param _bridge Address of the bridge */ function setBridge(address _bridge) external { @@ -38,6 +40,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function sendUnsignedTransaction( @@ -52,6 +55,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function sendContractTransaction( @@ -65,6 +69,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function sendL1FundedUnsignedTransaction( @@ -78,6 +83,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function sendL1FundedContractTransaction( @@ -90,16 +96,7 @@ contract InboxMock is IInbox { } /** - * @dev Creates a retryable ticket for an L2 transaction - * @param _destAddr Address of the contract to call in L2 - * @param _arbTxCallValue Callvalue to use in the L2 transaction - * @param _maxSubmissionCost Max cost of submitting the ticket, in Wei - * @param _submissionRefundAddress L2 address to refund for any remaining value from the submission cost - * @param _valueRefundAddress L2 address to refund if the ticket times out or gets cancelled - * @param _maxGas Max gas for the L2 transcation - * @param _gasPriceBid Gas price bid on L2 - * @param _data Encoded calldata for the L2 transaction (including function selector) - * @return message number returned by the bridge + * @inheritdoc IInbox */ function createRetryableTicket( address _destAddr, @@ -132,11 +129,16 @@ contract InboxMock is IInbox { ); } + /** + * @inheritdoc IInbox + * @dev Unimplemented in this mock + */ function depositEth(uint256) external payable override returns (uint256) { revert("Unimplemented"); } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function pauseCreateRetryables() external pure override { @@ -144,6 +146,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function unpauseCreateRetryables() external pure override { @@ -151,6 +154,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function startRewriteAddress() external pure override { @@ -158,6 +162,7 @@ contract InboxMock is IInbox { } /** + * @inheritdoc IInbox * @dev Unimplemented in this mock */ function stopRewriteAddress() external pure override { @@ -165,7 +170,7 @@ contract InboxMock is IInbox { } /** - * @dev Deliver a message to the bridge + * @notice Deliver a message to the bridge * @param _kind Type of the message * @param _sender Address that is sending the message * @param _messageData Encoded message data @@ -178,7 +183,7 @@ contract InboxMock is IInbox { } /** - * @dev Deliver a message to the bridge + * @notice Deliver a message to the bridge * @param _kind Type of the message * @param _sender Address that is sending the message * @param _messageDataHash keccak256 hash of the encoded message data diff --git a/packages/contracts/contracts/tests/arbitrum/OutboxMock.sol b/packages/contracts/contracts/tests/arbitrum/OutboxMock.sol index 92b9bb246..4191e9e0a 100644 --- a/packages/contracts/contracts/tests/arbitrum/OutboxMock.sol +++ b/packages/contracts/contracts/tests/arbitrum/OutboxMock.sol @@ -2,15 +2,26 @@ pragma solidity ^0.7.6; -import "../../arbitrum/IOutbox.sol"; -import "../../arbitrum/IBridge.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { IOutbox } from "../../arbitrum/IOutbox.sol"; +import { IBridge } from "../../arbitrum/IBridge.sol"; /** * @title Arbitrum Outbox mock contract * @dev This contract implements (a subset of) Arbitrum's IOutbox interface for testing purposes */ contract OutboxMock is IOutbox { - // Context of an L2-to-L1 function call + /** + * @dev Context of an L2-to-L1 function call + * @param l2Block L2 block number + * @param l1Block L1 block number + * @param timestamp Timestamp of the call + * @param batchNum Batch number + * @param outputId Output ID + * @param sender Address of the sender + */ struct L2ToL1Context { uint128 l2Block; uint128 l1Block; @@ -19,7 +30,7 @@ contract OutboxMock is IOutbox { bytes32 outputId; address sender; } - // Context of the current L2-to-L1 function call (set and cleared in each transaction) + /// @dev Context of the current L2-to-L1 function call (set and cleared in each transaction) L2ToL1Context internal context; // Address of the (mock) Arbitrum Bridge @@ -33,59 +44,42 @@ contract OutboxMock is IOutbox { bridge = IBridge(_bridge); } - /** - * @dev Getter for the L2 sender of the current incoming message - */ + /// @inheritdoc IOutbox function l2ToL1Sender() external view override returns (address) { return context.sender; } - /** - * @dev Getter for the L2 block of the current incoming message - */ + /// @inheritdoc IOutbox function l2ToL1Block() external view override returns (uint256) { return context.l2Block; } - /** - * @dev Getter for the L1 block of the current incoming message - */ + /// @inheritdoc IOutbox function l2ToL1EthBlock() external view override returns (uint256) { return context.l1Block; } - /** - * @dev Getter for the L1 timestamp of the current incoming message - */ + /// @inheritdoc IOutbox function l2ToL1Timestamp() external view override returns (uint256) { return context.timestamp; } - /** - * @dev Getter for the L2 batch number of the current incoming message - */ + /// @inheritdoc IOutbox function l2ToL1BatchNum() external view override returns (uint256) { return context.batchNum; } - /** - * @dev Getter for the output ID of the current incoming message - */ + /// @inheritdoc IOutbox function l2ToL1OutputId() external view override returns (bytes32) { return context.outputId; } - /** - * @dev Unimplemented in this mock - */ + /// @inheritdoc IOutbox function processOutgoingMessages(bytes calldata, uint256[] calldata) external pure override { revert("Unimplemented"); } - /** - * @dev Check whether an outbox entry for a message exists. - * This mock returns always true. - */ + /// @inheritdoc IOutbox function outboxEntryExists(uint256) external pure override returns (bool) { return true; } diff --git a/packages/contracts/contracts/tests/ens/IENS.sol b/packages/contracts/contracts/tests/ens/IENS.sol index f03cb651c..042a9170f 100644 --- a/packages/contracts/contracts/tests/ens/IENS.sol +++ b/packages/contracts/contracts/tests/ens/IENS.sol @@ -1,9 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + pragma solidity ^0.7.6; // Needed for abi and typechain in the npm package +/** + * @title ENS Registry Interface + * @author Edge & Node + * @notice Interface for the Ethereum Name Service registry + */ interface IENS { + /** + * @notice Get the owner of a node + * @param node The node to query + * @return The address of the owner + */ function owner(bytes32 node) external view returns (address); - // Must call setRecord, not setOwner, We must namehash it ourselves as well - function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external; + /** + * @notice Set the record for a subnode + * @dev Must call setRecord, not setOwner. We must namehash it ourselves as well. + * @param node The parent node + * @param label The label hash of the subnode + * @param _owner The address of the new owner + * @param resolver The address of the resolver + * @param ttl The TTL in seconds + */ + function setSubnodeRecord(bytes32 node, bytes32 label, address _owner, address resolver, uint64 ttl) external; } diff --git a/packages/contracts/contracts/tests/ens/IPublicResolver.sol b/packages/contracts/contracts/tests/ens/IPublicResolver.sol index 06ce2243b..7a449fb8d 100644 --- a/packages/contracts/contracts/tests/ens/IPublicResolver.sol +++ b/packages/contracts/contracts/tests/ens/IPublicResolver.sol @@ -1,8 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + pragma solidity ^0.7.6; // Needed for abi and typechain in the npm package +/** + * @title ENS Public Resolver Interface + * @author Edge & Node + * @notice Interface for the ENS public resolver contract + */ interface IPublicResolver { + /** + * @notice Get the text record for a node + * @param node The node to query + * @param key The key of the text record + * @return The text record value + */ function text(bytes32 node, string calldata key) external view returns (string memory); + /** + * @notice Set the text record for a node + * @param node The node to set the record for + * @param key The key of the text record + * @param value The value to set + */ function setText(bytes32 node, string calldata key, string calldata value) external; } diff --git a/packages/contracts/contracts/tests/ens/ITestRegistrar.sol b/packages/contracts/contracts/tests/ens/ITestRegistrar.sol index 8a795cc85..406a27fb7 100644 --- a/packages/contracts/contracts/tests/ens/ITestRegistrar.sol +++ b/packages/contracts/contracts/tests/ens/ITestRegistrar.sol @@ -1,5 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + pragma solidity ^0.7.6; +/** + * @title Test Registrar Interface + * @author Edge & Node + * @notice Interface for a test ENS registrar contract + */ interface ITestRegistrar { + /** + * @notice Register a name with the registrar + * @param label The label hash to register + * @param owner The address to assign ownership to + */ function register(bytes32 label, address owner) external; } diff --git a/packages/contracts/contracts/token/GraphToken.sol b/packages/contracts/contracts/token/GraphToken.sol index 53496b9a5..652fa5477 100644 --- a/packages/contracts/contracts/token/GraphToken.sol +++ b/packages/contracts/contracts/token/GraphToken.sol @@ -2,16 +2,21 @@ pragma solidity ^0.7.6; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol"; -import "@openzeppelin/contracts/cryptography/ECDSA.sol"; -import "@openzeppelin/contracts/math/SafeMath.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings, gas-strict-inequalities +// solhint-disable named-parameters-mapping -import "../governance/Governed.sol"; +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ERC20Burnable } from "@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol"; +import { ECDSA } from "@openzeppelin/contracts/cryptography/ECDSA.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; + +import { Governed } from "../governance/Governed.sol"; /** * @title GraphToken contract - * @dev This is the implementation of the ERC20 Graph Token. + * @author Edge & Node + * @notice This is the implementation of the ERC20 Graph Token. * The implementation exposes a Permit() function to allow for a spender to send a signed message * and approve funds to a spender following EIP2612 to make integration with other contracts easier. * @@ -28,32 +33,53 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { // -- EIP712 -- // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#definition-of-domainseparator + /// @dev EIP-712 domain type hash for signature verification bytes32 private constant DOMAIN_TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"); + /// @dev EIP-712 domain name hash for signature verification bytes32 private constant DOMAIN_NAME_HASH = keccak256("Graph Token"); + /// @dev EIP-712 domain version hash for signature verification bytes32 private constant DOMAIN_VERSION_HASH = keccak256("0"); + /// @dev EIP-712 domain salt for signature verification (randomly generated) bytes32 private constant DOMAIN_SALT = 0x51f3d585afe6dfeb2af01bba0889a36c1db03beec88c6a4d0c53817069026afa; // Randomly generated salt + /// @dev EIP-712 permit typehash for signature verification bytes32 private constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); // -- State -- - bytes32 private DOMAIN_SEPARATOR; + /// @dev EIP-712 domain separator for signature verification + bytes32 private domainSeparator; + /// @dev Mapping of addresses authorized to mint tokens mapping(address => bool) private _minters; + /** + * @notice Nonces for permit functionality (EIP-2612) + * @dev Mapping from owner address to current nonce for permit signatures + */ mapping(address => uint256) public nonces; // -- Events -- + /** + * @notice Emitted when a new minter is added + * @param account Address of the minter that was added + */ event MinterAdded(address indexed account); + + /** + * @notice Emitted when a minter is removed + * @param account Address of the minter that was removed + */ event MinterRemoved(address indexed account); + /// @dev Modifier to restrict access to minters only modifier onlyMinter() { require(isMinter(msg.sender), "Only minter can call"); _; } /** - * @dev Graph Token Contract Constructor. + * @notice Graph Token Contract Constructor. * @param _initialSupply Initial supply of GRT */ constructor(uint256 _initialSupply) ERC20("Graph Token", "GRT") { @@ -66,7 +92,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { _addMinter(msg.sender); // EIP-712 domain separator - DOMAIN_SEPARATOR = keccak256( + domainSeparator = keccak256( abi.encode( DOMAIN_TYPE_HASH, DOMAIN_NAME_HASH, @@ -79,7 +105,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Approve token allowance by validating a message signed by the holder. + * @notice Approve token allowance by validating a message signed by the holder. * @param _owner Address of the token holder * @param _spender Address of the approved spender * @param _value Amount of tokens to approve the spender @@ -100,7 +126,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", - DOMAIN_SEPARATOR, + domainSeparator, keccak256(abi.encode(PERMIT_TYPEHASH, _owner, _spender, _value, nonces[_owner], _deadline)) ) ); @@ -114,7 +140,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Add a new minter. + * @notice Add a new minter. * @param _account Address of the minter */ function addMinter(address _account) external onlyGovernor { @@ -122,7 +148,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Remove a minter. + * @notice Remove a minter. * @param _account Address of the minter */ function removeMinter(address _account) external onlyGovernor { @@ -130,14 +156,14 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Renounce to be a minter. + * @notice Renounce to be a minter. */ function renounceMinter() external { _removeMinter(msg.sender); } /** - * @dev Mint new tokens. + * @notice Mint new tokens. * @param _to Address to send the newly minted tokens * @param _amount Amount of tokens to mint */ @@ -146,7 +172,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Return if the `_account` is a minter or not. + * @notice Return if the `_account` is a minter or not. * @param _account Address to check * @return True if the `_account` is minter */ @@ -155,7 +181,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Add a new minter. + * @notice Add a new minter. * @param _account Address of the minter */ function _addMinter(address _account) private { @@ -164,7 +190,7 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Remove a minter. + * @notice Remove a minter. * @param _account Address of the minter */ function _removeMinter(address _account) private { @@ -173,11 +199,12 @@ contract GraphToken is Governed, ERC20, ERC20Burnable { } /** - * @dev Get the running network chain ID. + * @notice Get the running network chain ID. * @return The chain ID */ function _getChainID() private pure returns (uint256) { uint256 id; + // solhint-disable-next-line no-inline-assembly assembly { id := chainid() } diff --git a/packages/contracts/contracts/token/IGraphToken.sol b/packages/contracts/contracts/token/IGraphToken.sol index df3b7643f..924183e46 100644 --- a/packages/contracts/contracts/token/IGraphToken.sol +++ b/packages/contracts/contracts/token/IGraphToken.sol @@ -1,30 +1,82 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6 || 0.8.27; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - +pragma solidity ^0.7.6 || ^0.8.0; + +// Solhint linting fails for 0.8.0. +// solhint-disable-next-line import-path-check +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title IGraphToken + * @author Edge & Node + * @notice Interface for the Graph Token contract + * @dev Extends IERC20 with additional functionality for minting, burning, and permit + */ interface IGraphToken is IERC20 { // -- Mint and Burn -- + /** + * @notice Burns tokens from the caller's account + * @param amount The amount of tokens to burn + */ function burn(uint256 amount) external; + /** + * @notice Burns tokens from a specified account (requires allowance) + * @param _from The account to burn tokens from + * @param amount The amount of tokens to burn + */ function burnFrom(address _from, uint256 amount) external; + /** + * @notice Mints new tokens to a specified account + * @dev Only callable by accounts with minter role + * @param _to The account to mint tokens to + * @param _amount The amount of tokens to mint + */ function mint(address _to, uint256 _amount) external; // -- Mint Admin -- + /** + * @notice Adds a new minter account + * @dev Only callable by accounts with appropriate permissions + * @param _account The account to grant minter role to + */ function addMinter(address _account) external; + /** + * @notice Removes minter role from an account + * @dev Only callable by accounts with appropriate permissions + * @param _account The account to revoke minter role from + */ function removeMinter(address _account) external; + /** + * @notice Renounces minter role for the caller + * @dev Allows a minter to voluntarily give up their minting privileges + */ function renounceMinter() external; + /** + * @notice Checks if an account has minter role + * @param _account The account to check + * @return True if the account is a minter, false otherwise + */ function isMinter(address _account) external view returns (bool); // -- Permit -- + /** + * @notice Allows approval via signature (EIP-2612) + * @param _owner The token owner's address + * @param _spender The spender's address + * @param _value The allowance amount + * @param _deadline The deadline timestamp for the permit + * @param _v The recovery byte of the signature + * @param _r Half of the ECDSA signature pair + * @param _s Half of the ECDSA signature pair + */ function permit( address _owner, address _spender, @@ -37,7 +89,19 @@ interface IGraphToken is IERC20 { // -- Allowance -- + /** + * @notice Increases the allowance granted to a spender + * @param spender The account whose allowance will be increased + * @param addedValue The amount to increase the allowance by + * @return True if the operation succeeded + */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool); + /** + * @notice Decreases the allowance granted to a spender + * @param spender The account whose allowance will be decreased + * @param subtractedValue The amount to decrease the allowance by + * @return True if the operation succeeded + */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); } diff --git a/packages/contracts/contracts/upgrades/GraphProxy.sol b/packages/contracts/contracts/upgrades/GraphProxy.sol index d6fbfac7f..733e3c0be 100644 --- a/packages/contracts/contracts/upgrades/GraphProxy.sol +++ b/packages/contracts/contracts/upgrades/GraphProxy.sol @@ -2,13 +2,19 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings + +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + import { GraphProxyStorage } from "./GraphProxyStorage.sol"; import { IGraphProxy } from "./IGraphProxy.sol"; /** * @title Graph Proxy - * @dev Graph Proxy contract used to delegate call implementation contracts and support upgrades. + * @author Edge & Node + * @notice Graph Proxy contract used to delegate call implementation contracts and support upgrades. * This contract should NOT define storage as it is managed by GraphProxyStorage. * This contract implements a proxy that is upgradeable by an admin. * https://docs.openzeppelin.com/upgrades-plugins/1.x/proxies#transparent-proxies-and-function-clashes @@ -69,56 +75,49 @@ contract GraphProxy is GraphProxyStorage, IGraphProxy { } /** - * @notice Get the current admin - * + * @inheritdoc IGraphProxy * @dev NOTE: Only the admin and implementation can call this function. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` - * - * @return The address of the current admin */ - function admin() external override ifAdminOrPendingImpl returns (address) { + function admin() external override ifAdminOrPendingImpl returns (address adminAddress) { return _getAdmin(); } /** - * @notice Get the current implementation. - * + * @inheritdoc IGraphProxy * @dev NOTE: Only the admin can call this function. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` - * - * @return The address of the current implementation for this proxy */ - function implementation() external override ifAdminOrPendingImpl returns (address) { + function implementation() external override ifAdminOrPendingImpl returns (address implementationAddress) { return _getImplementation(); } /** - * @notice Get the current pending implementation. - * + * @inheritdoc IGraphProxy * @dev NOTE: Only the admin can call this function. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c` - * - * @return The address of the current pending implementation for this proxy */ - function pendingImplementation() external override ifAdminOrPendingImpl returns (address) { + function pendingImplementation() + external + override + ifAdminOrPendingImpl + returns (address pendingImplementationAddress) + { return _getPendingImplementation(); } /** - * @notice Changes the admin of the proxy. - * + * @inheritdoc IGraphProxy * @dev NOTE: Only the admin can call this function. - * - * @param _newAdmin Address of the new admin */ function setAdmin(address _newAdmin) external override ifAdmin { require(_newAdmin != address(0), "Admin cant be the zero address"); @@ -126,25 +125,22 @@ contract GraphProxy is GraphProxyStorage, IGraphProxy { } /** - * @notice Upgrades to a new implementation contract. + * @inheritdoc IGraphProxy * @dev NOTE: Only the admin can call this function. - * @param _newImplementation Address of implementation contract */ function upgradeTo(address _newImplementation) external override ifAdmin { _setPendingImplementation(_newImplementation); } /** - * @notice Admin function for new implementation to accept its role as implementation. + * @inheritdoc IGraphProxy */ function acceptUpgrade() external override ifAdminOrPendingImpl { _acceptUpgrade(); } /** - * @notice Admin function for new implementation to accept its role as implementation, - * calling a function on the new implementation. - * @param data Calldata (including selector) for the function to delegatecall into the implementation + * @inheritdoc IGraphProxy */ function acceptUpgradeAndCall(bytes calldata data) external override ifAdminOrPendingImpl { _acceptUpgrade(); @@ -154,7 +150,7 @@ contract GraphProxy is GraphProxyStorage, IGraphProxy { } /** - * @dev Admin function for new implementation to accept its role as implementation. + * @notice Admin function for new implementation to accept its role as implementation. */ function _acceptUpgrade() internal { address _pendingImplementation = _getPendingImplementation(); @@ -166,7 +162,7 @@ contract GraphProxy is GraphProxyStorage, IGraphProxy { } /** - * @dev Delegates the current call to implementation. + * @notice Delegates the current call to implementation. * This function does not return to its internal call site, it will return directly to the * external caller. */ diff --git a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol index db8e9dcb3..83550a3e5 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol @@ -2,6 +2,8 @@ pragma solidity ^0.7.6 || 0.8.27; +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + import { Governed } from "../governance/Governed.sol"; import { IGraphProxy } from "./IGraphProxy.sol"; @@ -9,7 +11,8 @@ import { GraphUpgradeable } from "./GraphUpgradeable.sol"; /** * @title GraphProxyAdmin - * @dev This is the owner of upgradeable proxy contracts. + * @author Edge & Node + * @notice This is the owner of upgradeable proxy contracts. * Proxy contracts use a TransparentProxy pattern, any admin related call * like upgrading a contract or changing the admin needs to be send through * this contract. diff --git a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol index 7871e4996..828af8e23 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol @@ -2,9 +2,12 @@ pragma solidity ^0.7.6 || 0.8.27; +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + /** * @title Graph Proxy Storage - * @dev Contract functions related to getting and setting proxy storage. + * @author Edge & Node + * @notice Contract functions related to getting and setting proxy storage. * This contract does not actually define state variables managed by the compiler * but uses fixed slot locations. */ @@ -32,7 +35,9 @@ abstract contract GraphProxyStorage { bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** - * @dev Emitted when pendingImplementation is changed. + * @notice Emitted when pendingImplementation is changed. + * @param oldPendingImplementation Address of the previous pending implementation + * @param newPendingImplementation Address of the new pending implementation */ event PendingImplementationUpdated( address indexed oldPendingImplementation, @@ -40,13 +45,17 @@ abstract contract GraphProxyStorage { ); /** - * @dev Emitted when pendingImplementation is accepted, + * @notice Emitted when pendingImplementation is accepted, * which means contract implementation is updated. + * @param oldImplementation Address of the previous implementation + * @param newImplementation Address of the new implementation */ event ImplementationUpdated(address indexed oldImplementation, address indexed newImplementation); /** - * @dev Emitted when the admin account has changed. + * @notice Emitted when the admin account has changed. + * @param oldAdmin Address of the previous admin + * @param newAdmin Address of the new admin */ event AdminUpdated(address indexed oldAdmin, address indexed newAdmin); @@ -59,6 +68,7 @@ abstract contract GraphProxyStorage { } /** + * @notice Returns the current admin address * @return adm The admin slot. */ function _getAdmin() internal view returns (address adm) { @@ -70,7 +80,7 @@ abstract contract GraphProxyStorage { } /** - * @dev Sets the address of the proxy admin. + * @notice Sets the address of the proxy admin. * @param _newAdmin Address of the new proxy admin */ function _setAdmin(address _newAdmin) internal { @@ -85,7 +95,7 @@ abstract contract GraphProxyStorage { } /** - * @dev Returns the current implementation. + * @notice Returns the current implementation. * @return impl Address of the current implementation */ function _getImplementation() internal view returns (address impl) { @@ -97,7 +107,7 @@ abstract contract GraphProxyStorage { } /** - * @dev Returns the current pending implementation. + * @notice Returns the current pending implementation. * @return impl Address of the current pending implementation */ function _getPendingImplementation() internal view returns (address impl) { @@ -109,7 +119,7 @@ abstract contract GraphProxyStorage { } /** - * @dev Sets the implementation address of the proxy. + * @notice Sets the implementation address of the proxy. * @param _newImplementation Address of the new implementation */ function _setImplementation(address _newImplementation) internal { @@ -125,7 +135,7 @@ abstract contract GraphProxyStorage { } /** - * @dev Sets the pending implementation address of the proxy. + * @notice Sets the pending implementation address of the proxy. * @param _newImplementation Address of the new pending implementation */ function _setPendingImplementation(address _newImplementation) internal { diff --git a/packages/contracts/contracts/upgrades/GraphUpgradeable.sol b/packages/contracts/contracts/upgrades/GraphUpgradeable.sol index 60dfbe888..ada2b04fd 100644 --- a/packages/contracts/contracts/upgrades/GraphUpgradeable.sol +++ b/packages/contracts/contracts/upgrades/GraphUpgradeable.sol @@ -2,11 +2,14 @@ pragma solidity ^0.7.6 || 0.8.27; +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + import { IGraphProxy } from "./IGraphProxy.sol"; /** * @title Graph Upgradeable - * @dev This contract is intended to be inherited from upgradeable contracts. + * @author Edge & Node + * @notice This contract is intended to be inherited from upgradeable contracts. */ abstract contract GraphUpgradeable { /** @@ -18,6 +21,7 @@ abstract contract GraphUpgradeable { /** * @dev Check if the caller is the proxy admin. + * @param _proxy The proxy contract to check admin for */ modifier onlyProxyAdmin(IGraphProxy _proxy) { require(msg.sender == _proxy.admin(), "Caller must be the proxy admin"); @@ -33,7 +37,7 @@ abstract contract GraphUpgradeable { } /** - * @dev Returns the current implementation. + * @notice Returns the current implementation. * @return impl Address of the current implementation */ function _implementation() internal view returns (address impl) { diff --git a/packages/contracts/contracts/upgrades/IGraphProxy.sol b/packages/contracts/contracts/upgrades/IGraphProxy.sol index 4f501ed7c..a3f2fdd8e 100644 --- a/packages/contracts/contracts/upgrades/IGraphProxy.sol +++ b/packages/contracts/contracts/upgrades/IGraphProxy.sol @@ -2,18 +2,76 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Graph Proxy Interface + * @author Edge & Node + * @notice Interface for the Graph Proxy contract that handles upgradeable proxy functionality + */ interface IGraphProxy { + /** + * @notice Get the current admin. + * + * @dev NOTE: Only the admin can call this function. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` + * + * @return adminAddress The address of the current admin + */ function admin() external returns (address); + /** + * @notice Change the admin of the proxy. + * + * @dev NOTE: Only the admin can call this function. + * + * @param _newAdmin Address of the new admin + */ function setAdmin(address _newAdmin) external; + /** + * @notice Get the current implementation. + * + * @dev NOTE: Only the admin can call this function. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` + * + * @return implementationAddress The address of the current implementation for this proxy + */ function implementation() external returns (address); + /** + * @notice Get the current pending implementation. + * + * @dev NOTE: Only the admin can call this function. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c` + * + * @return pendingImplementationAddress The address of the current pending implementation for this proxy + */ function pendingImplementation() external returns (address); + /** + * @notice Upgrades to a new implementation contract. + * @dev NOTE: Only the admin can call this function. + * @param _newImplementation Address of implementation contract + */ function upgradeTo(address _newImplementation) external; + /** + * @notice Admin function for new implementation to accept its role as implementation. + */ function acceptUpgrade() external; + /** + * @notice Admin function for new implementation to accept its role as implementation, + * calling a function on the new implementation. + * @param data Calldata (including selector) for the function to delegatecall into the implementation + */ function acceptUpgradeAndCall(bytes calldata data) external; } diff --git a/packages/contracts/contracts/utils/TokenUtils.sol b/packages/contracts/contracts/utils/TokenUtils.sol index ef2f03211..50ad277b4 100644 --- a/packages/contracts/contracts/utils/TokenUtils.sol +++ b/packages/contracts/contracts/utils/TokenUtils.sol @@ -2,17 +2,20 @@ pragma solidity ^0.7.6 || 0.8.27; +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + import { IGraphToken } from "../token/IGraphToken.sol"; /** * @title TokenUtils library + * @author Edge & Node * @notice This library contains utility functions for handling tokens (transfers and burns). * It is specifically adapted for the GraphToken, so does not need to handle edge cases * for other tokens. */ library TokenUtils { /** - * @dev Pull tokens from an address to this contract. + * @notice Pull tokens from an address to this contract. * @param _graphToken Token to transfer * @param _from Address sending the tokens * @param _amount Amount of tokens to transfer @@ -24,7 +27,7 @@ library TokenUtils { } /** - * @dev Push tokens from this contract to a receiving address. + * @notice Push tokens from this contract to a receiving address. * @param _graphToken Token to transfer * @param _to Address receiving the tokens * @param _amount Amount of tokens to transfer @@ -36,7 +39,7 @@ library TokenUtils { } /** - * @dev Burn tokens held by this contract. + * @notice Burn tokens held by this contract. * @param _graphToken Token to burn * @param _amount Amount of tokens to burn */ diff --git a/packages/contracts/task/tasks/e2e/e2e.ts b/packages/contracts/task/tasks/e2e/e2e.ts index dec7bcfc7..42b3fe066 100644 --- a/packages/contracts/task/tasks/e2e/e2e.ts +++ b/packages/contracts/task/tasks/e2e/e2e.ts @@ -1,7 +1,7 @@ import { isGraphL1ChainId } from '@graphprotocol/sdk' import { greTask } from '@graphprotocol/sdk/gre' import fs from 'fs' -import glob from 'glob' +import { globSync } from 'glob' import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' import { runScriptWithHardhat } from 'hardhat/internal/util/scripts-runner' import { HardhatRuntimeEnvironment, TaskArguments } from 'hardhat/types' @@ -29,7 +29,7 @@ const setGraphConfig = (args: TaskArguments, hre: HardhatRuntimeEnvironment) => greTask('e2e', 'Run all e2e tests') .addFlag('skipBridge', 'Skip bridge tests') .setAction(async (args, hre: HardhatRuntimeEnvironment) => { - let testFiles = [...new glob.GlobSync(CONFIG_TESTS).found, ...new glob.GlobSync(INIT_TESTS).found] + let testFiles = [...globSync(CONFIG_TESTS), ...globSync(INIT_TESTS)] if (args.skipBridge) { testFiles = testFiles.filter((file) => !/l1|l2/.test(file)) @@ -46,7 +46,7 @@ greTask('e2e', 'Run all e2e tests') greTask('e2e:config', 'Run deployment configuration e2e tests').setAction( async (args, hre: HardhatRuntimeEnvironment) => { - const files = new glob.GlobSync(CONFIG_TESTS).found + const files = globSync(CONFIG_TESTS) // Disable secure accounts, we don't need them for this task hre.config.graph.disableSecureAccounts = true @@ -60,7 +60,7 @@ greTask('e2e:config', 'Run deployment configuration e2e tests').setAction( greTask('e2e:init', 'Run deployment initialization e2e tests').setAction( async (args, hre: HardhatRuntimeEnvironment) => { - const files = new glob.GlobSync(INIT_TESTS).found + const files = globSync(INIT_TESTS) // Disable secure accounts, we don't need them for this task hre.config.graph.disableSecureAccounts = true diff --git a/packages/data-edge/contracts/DataEdge.sol b/packages/data-edge/contracts/DataEdge.sol index fc39b7386..8b02c3ce0 100644 --- a/packages/data-edge/contracts/DataEdge.sol +++ b/packages/data-edge/contracts/DataEdge.sol @@ -5,8 +5,10 @@ pragma solidity ^0.8.12; /// @title Data Edge contract is only used to store on-chain data, it does not /// perform execution. On-chain client services can read the data /// and decode the payload for different purposes. +/// @author Edge & Node +/// @notice Contract for storing on-chain data without execution contract DataEdge { - /// @dev Fallback function, accepts any payload + /// @notice Fallback function, accepts any payload fallback() external payable { // no-op } diff --git a/packages/data-edge/contracts/EventfulDataEdge.sol b/packages/data-edge/contracts/EventfulDataEdge.sol index d995be665..d3725f151 100644 --- a/packages/data-edge/contracts/EventfulDataEdge.sol +++ b/packages/data-edge/contracts/EventfulDataEdge.sol @@ -6,9 +6,14 @@ pragma solidity ^0.8.12; /// perform execution. On-chain client services can read the data /// and decode the payload for different purposes. /// NOTE: This version emits an event with the calldata. +/// @author Edge & Node +/// @notice Contract for storing on-chain data with event logging contract EventfulDataEdge { + /// @notice Emitted when data is received + /// @param data The calldata received by the contract event Log(bytes data); + /// @notice Accepts any payload and emits it as an event /// @dev Fallback function, accepts any payload fallback() external payable { emit Log(msg.data); diff --git a/packages/horizon/contracts/data-service/DataService.sol b/packages/horizon/contracts/data-service/DataService.sol index 6b14365d5..21205dbfe 100644 --- a/packages/horizon/contracts/data-service/DataService.sol +++ b/packages/horizon/contracts/data-service/DataService.sol @@ -9,6 +9,7 @@ import { ProvisionManager } from "./utilities/ProvisionManager.sol"; /** * @title DataService contract + * @author Edge & Node * @dev Implementation of the {IDataService} interface. * @notice This implementation provides base functionality for a data service: * - GraphDirectory, allows the data service to interact with Graph Horizon contracts @@ -32,6 +33,7 @@ import { ProvisionManager } from "./utilities/ProvisionManager.sol"; */ abstract contract DataService is GraphDirectory, ProvisionManager, DataServiceV1Storage, IDataService { /** + * @notice Constructor for the DataService contract * @dev Addresses in GraphDirectory are immutables, they can only be set in this constructor. * @param controller The address of the Graph Horizon controller contract. */ diff --git a/packages/horizon/contracts/data-service/DataServiceStorage.sol b/packages/horizon/contracts/data-service/DataServiceStorage.sol index df759b892..0b6d27e4b 100644 --- a/packages/horizon/contracts/data-service/DataServiceStorage.sol +++ b/packages/horizon/contracts/data-service/DataServiceStorage.sol @@ -3,7 +3,8 @@ pragma solidity 0.8.27; /** * @title DataServiceStorage - * @dev This contract holds the storage variables for the DataService contract. + * @author Edge & Node + * @notice This contract holds the storage variables for the DataService contract. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol b/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol index a82c15361..91f5c5f4e 100644 --- a/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol +++ b/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol @@ -12,6 +12,7 @@ import { DataServiceFeesV1Storage } from "./DataServiceFeesStorage.sol"; /** * @title DataServiceFees contract + * @author Edge & Node * @dev Implementation of the {IDataServiceFees} interface. * @notice Extension for the {IDataService} contract to handle payment collateralization * using a Horizon provision. See {IDataServiceFees} for more details. diff --git a/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol b/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol index 78d826f03..bafb8fe52 100644 --- a/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol +++ b/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol @@ -7,6 +7,8 @@ import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/interna /** * @title Storage layout for the {DataServiceFees} extension contract. + * @author Edge & Node + * @notice Storage layout for the DataServiceFees extension contract * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol b/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol index a4c60f7db..b1bd4203a 100644 --- a/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol +++ b/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol @@ -8,6 +8,7 @@ import { DataService } from "../DataService.sol"; /** * @title DataServicePausable contract + * @author Edge & Node * @dev Implementation of the {IDataServicePausable} interface. * @notice Extension for the {IDataService} contract, adds pausing functionality * to the data service. Pausing is controlled by privileged accounts called diff --git a/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol b/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol index 2ca8e09c6..ad792f914 100644 --- a/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol +++ b/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol @@ -8,8 +8,9 @@ import { DataService } from "../DataService.sol"; /** * @title DataServicePausableUpgradeable contract + * @author Edge & Node + * @notice Upgradeable version of the {DataServicePausable} contract. * @dev Implementation of the {IDataServicePausable} interface. - * @dev Upgradeable version of the {DataServicePausable} contract. * @dev This contract inherits from {DataService} which needs to be initialized, please see * {DataService} for detailed instructions. * @custom:security-contact Please email security+contracts@thegraph.com if you find any diff --git a/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol b/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol index 0bb600a01..a6af01533 100644 --- a/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol +++ b/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol @@ -12,8 +12,9 @@ import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.s /** * @title Rescuable contract - * @dev Allows a contract to have a function to rescue tokens sent by mistake. - * The contract must implement the external rescueTokens function or similar, + * @author Edge & Node + * @notice Allows a contract to have a function to rescue tokens sent by mistake. + * @dev The contract must implement the external rescueTokens function or similar, * that calls this contract's _rescueTokens. * @dev Note that this extension does not provide an external function to set * rescuers. This should be implemented in the derived contract. @@ -63,7 +64,7 @@ abstract contract DataServiceRescuable is DataService, IDataServiceRescuable { } /** - * @dev Allows rescuing tokens sent to this contract + * @notice Allows rescuing tokens sent to this contract * @param _to Destination address to send the tokens * @param _token Address of the token being rescued * @param _tokens Amount of tokens to pull diff --git a/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol b/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol index 06612913d..42f4a7de9 100644 --- a/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol +++ b/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; /** * @title ProvisionTracker library + * @author Edge & Node * @notice A library to facilitate tracking of "used tokens" on Graph Horizon provisions. This can be used to * ensure data services have enough economic security (provisioned stake) to back the payments they collect for * their services. diff --git a/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol b/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol index db5a9e8f5..9d0db415b 100644 --- a/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol +++ b/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol @@ -1,6 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events +// solhint-disable gas-strict-inequalities + import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; import { UintRange } from "../../libraries/UintRange.sol"; @@ -12,6 +16,7 @@ import { ProvisionManagerV1Storage } from "./ProvisionManagerStorage.sol"; /** * @title ProvisionManager contract + * @author Edge & Node * @notice A helper contract that implements several provision management functions. * @dev Provides utilities to verify provision parameters are within an acceptable range. Each * parameter has an overridable setter and getter for the validity range, and a checker that reverts diff --git a/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol b/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol index 5931c66e5..d2d3495ba 100644 --- a/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol +++ b/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol @@ -3,6 +3,8 @@ pragma solidity 0.8.27; /** * @title Storage layout for the {ProvisionManager} helper contract. + * @author Edge & Node + * @notice Storage layout for the ProvisionManager helper contract * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/horizon/contracts/libraries/Denominations.sol b/packages/horizon/contracts/libraries/Denominations.sol index 46cff3516..abd0ac9a6 100644 --- a/packages/horizon/contracts/libraries/Denominations.sol +++ b/packages/horizon/contracts/libraries/Denominations.sol @@ -3,7 +3,8 @@ pragma solidity 0.8.27; /** * @title Denominations library - * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20. + * @author Edge & Node + * @notice Provides a list of ground denominations for those tokens that cannot be represented by an ERC20 * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. diff --git a/packages/horizon/contracts/libraries/LibFixedMath.sol b/packages/horizon/contracts/libraries/LibFixedMath.sol index 704617b40..02c43f2c3 100644 --- a/packages/horizon/contracts/libraries/LibFixedMath.sol +++ b/packages/horizon/contracts/libraries/LibFixedMath.sol @@ -18,10 +18,16 @@ // SPDX-License-Identifier: Apache-2.0 +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities +// solhint-disable gas-increment-by-one +// solhint-disable function-max-lines + pragma solidity 0.8.27; /** * @title LibFixedMath + * @author Edge & Node * @notice This library provides fixed-point arithmetic operations. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. @@ -36,12 +42,20 @@ library LibFixedMath { // -63.875 int256 private constant EXP_MIN_VAL = -int256(0x0000000000000000000000000000001ff0000000000000000000000000000000); - /// @dev Get one as a fixed-point number. + /** + * @notice Get one as a fixed-point number + * @return f The fixed-point representation of one + */ function one() internal pure returns (int256 f) { f = FIXED_1; } - /// @dev Returns the addition of two fixed point numbers, reverting on overflow. + /** + * @notice Returns the subtraction of two fixed point numbers, reverting on overflow + * @param a The first fixed point number + * @param b The second fixed point number to subtract + * @return c The result of a - b + */ function sub(int256 a, int256 b) internal pure returns (int256 c) { if (b == MIN_FIXED_VAL) { revert("out-of-bounds"); @@ -49,19 +63,34 @@ library LibFixedMath { c = _add(a, -b); } - /// @dev Returns the multiplication of two fixed point numbers, reverting on overflow. + /** + * @notice Returns the multiplication of two fixed point numbers, reverting on overflow + * @param a The first fixed point number + * @param b The second fixed point number + * @return c The result of a * b + */ function mul(int256 a, int256 b) internal pure returns (int256 c) { c = _mul(a, b) / FIXED_1; } - /// @dev Performs (a * n) / d, without scaling for precision. + /** + * @notice Performs (a * n) / d, without scaling for precision + * @param a The first fixed point number + * @param n The numerator + * @param d The denominator + * @return c The result of (a * n) / d + */ function mulDiv(int256 a, int256 n, int256 d) internal pure returns (int256 c) { c = _div(_mul(a, n), d); } - /// @dev Returns the unsigned integer result of multiplying a fixed-point - /// number with an integer, reverting if the multiplication overflows. - /// Negative results are clamped to zero. + /** + * @notice Returns the unsigned integer result of multiplying a fixed-point number with an integer + * @dev Negative results are clamped to zero. Reverts if the multiplication overflows. + * @param f Fixed-point number + * @param u Unsigned integer + * @return Unsigned integer result, clamped to zero if negative + */ function uintMul(int256 f, uint256 u) internal pure returns (uint256) { if (int256(u) < int256(0)) { revert("out-of-bounds"); @@ -73,17 +102,30 @@ library LibFixedMath { return uint256(uint256(c) >> 127); } - /// @dev Convert signed `n` / `d` to a fixed-point number. + /** + * @notice Convert signed `n` / `d` to a fixed-point number + * @param n Numerator + * @param d Denominator + * @return f Fixed-point representation of n/d + */ function toFixed(int256 n, int256 d) internal pure returns (int256 f) { f = _div(_mul(n, FIXED_1), d); } - /// @dev Convert a fixed-point number to an integer. + /** + * @notice Convert a fixed-point number to an integer + * @param f Fixed-point number + * @return n Integer representation + */ function toInteger(int256 f) internal pure returns (int256 n) { return f / FIXED_1; } - /// @dev Compute the natural exponent for a fixed-point number EXP_MIN_VAL <= `x` <= 1 + /** + * @notice Compute the natural exponent for a fixed-point number EXP_MIN_VAL <= `x` <= 1 + * @param x Fixed-point number to compute exponent for + * @return r The natural exponent of x + */ function exp(int256 x) internal pure returns (int256 r) { if (x < EXP_MIN_VAL) { // Saturate to zero below EXP_MIN_VAL. @@ -205,7 +247,12 @@ library LibFixedMath { } } - /// @dev Returns the multiplication two numbers, reverting on overflow. + /** + * @notice Returns the multiplication of two numbers, reverting on overflow + * @param a First number + * @param b Second number + * @return c The result of a * b + */ function _mul(int256 a, int256 b) private pure returns (int256 c) { if (a == 0 || b == 0) { return 0; @@ -218,7 +265,12 @@ library LibFixedMath { } } - /// @dev Returns the division of two numbers, reverting on division by zero. + /** + * @notice Returns the division of two numbers, reverting on division by zero + * @param a Dividend + * @param b Divisor + * @return c The result of a / b + */ function _div(int256 a, int256 b) private pure returns (int256 c) { if (b == 0) { revert("overflow"); @@ -231,7 +283,12 @@ library LibFixedMath { } } - /// @dev Adds two numbers, reverting on overflow. + /** + * @notice Adds two numbers, reverting on overflow + * @param a First number + * @param b Second number + * @return c The result of a + b + */ function _add(int256 a, int256 b) private pure returns (int256 c) { unchecked { c = a + b; diff --git a/packages/horizon/contracts/libraries/LinkedList.sol b/packages/horizon/contracts/libraries/LinkedList.sol index 9d3305329..d49cd8c24 100644 --- a/packages/horizon/contracts/libraries/LinkedList.sol +++ b/packages/horizon/contracts/libraries/LinkedList.sol @@ -1,11 +1,17 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities +// solhint-disable gas-increment-by-one +// solhint-disable function-max-lines + pragma solidity 0.8.27; import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; /** * @title LinkedList library + * @author Edge & Node * @notice A library to manage singly linked lists. * * The library makes no assumptions about the contents of the items, the only diff --git a/packages/horizon/contracts/libraries/MathUtils.sol b/packages/horizon/contracts/libraries/MathUtils.sol index fc81e9608..6c0a09a1a 100644 --- a/packages/horizon/contracts/libraries/MathUtils.sol +++ b/packages/horizon/contracts/libraries/MathUtils.sol @@ -1,23 +1,29 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + pragma solidity 0.8.27; /** * @title MathUtils Library + * @author Edge & Node * @notice A collection of functions to perform math operations * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ library MathUtils { /** - * @dev Calculates the weighted average of two values pondering each of these - * values based on configured weights. The contribution of each value N is + * @notice Calculates the weighted average of two values pondering each of these + * values based on configured weights + * @dev The contribution of each value N is * weightN/(weightA + weightB). The calculation rounds up to ensure the result * is always equal or greater than the smallest of the two values. * @param valueA The amount for value A * @param weightA The weight to use for value A * @param valueB The amount for value B * @param weightB The weight to use for value B + * @return The weighted average result */ function weightedAverageRoundingUp( uint256 valueA, @@ -29,7 +35,7 @@ library MathUtils { } /** - * @dev Returns the minimum of two numbers. + * @notice Returns the minimum of two numbers * @param x The first number * @param y The second number * @return The minimum of the two numbers @@ -39,7 +45,7 @@ library MathUtils { } /** - * @dev Returns the difference between two numbers or zero if negative. + * @notice Returns the difference between two numbers or zero if negative * @param x The first number * @param y The second number * @return The difference between the two numbers or zero if negative diff --git a/packages/horizon/contracts/libraries/PPMMath.sol b/packages/horizon/contracts/libraries/PPMMath.sol index a7966c91d..998a912e8 100644 --- a/packages/horizon/contracts/libraries/PPMMath.sol +++ b/packages/horizon/contracts/libraries/PPMMath.sol @@ -1,8 +1,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + /** * @title PPMMath library + * @author Edge & Node * @notice A library for handling calculations with parts per million (PPM) amounts. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. diff --git a/packages/horizon/contracts/libraries/UintRange.sol b/packages/horizon/contracts/libraries/UintRange.sol index 69d3f5d8a..7c9bdfdd8 100644 --- a/packages/horizon/contracts/libraries/UintRange.sol +++ b/packages/horizon/contracts/libraries/UintRange.sol @@ -1,8 +1,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + /** * @title UintRange library + * @author Edge & Node * @notice A library for handling range checks on uint256 values. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. diff --git a/packages/horizon/contracts/mocks/ControllerMock.sol b/packages/horizon/contracts/mocks/ControllerMock.sol index 638387f0c..415e48c5e 100644 --- a/packages/horizon/contracts/mocks/ControllerMock.sol +++ b/packages/horizon/contracts/mocks/ControllerMock.sol @@ -7,22 +7,30 @@ import { IManaged } from "@graphprotocol/interfaces/contracts/contracts/governan /** * @title Graph Controller contract (mock) + * @author Edge & Node + * @notice Mock implementation of the Graph Controller contract for testing * @dev Controller is a registry of contracts for convenience. Inspired by Livepeer: * https://github.com/livepeer/protocol/blob/streamflow/contracts/Controller.sol */ contract ControllerMock is IController { /// @dev Track contract ids to contract proxy address mapping(bytes32 contractName => address contractAddress) private _registry; + + /// @notice Address of the governor address public governor; bool internal _paused; bool internal _partialPaused; address internal _pauseGuardian; - /// Emitted when the proxy address for a protocol contract has been set - event SetContractProxy(bytes32 indexed id, address contractAddress); + /** + * @notice Emitted when the proxy address for a protocol contract has been set + * @param id The contract identifier + * @param contractAddress The new contract address + */ + event SetContractProxy(bytes32 indexed id, address indexed contractAddress); /** - * Constructor for the Controller mock + * @notice Constructor for the Controller mock * @param governor_ Address of the governor */ constructor(address governor_) { diff --git a/packages/horizon/contracts/mocks/CurationMock.sol b/packages/horizon/contracts/mocks/CurationMock.sol index ea3df0587..9de0fea16 100644 --- a/packages/horizon/contracts/mocks/CurationMock.sol +++ b/packages/horizon/contracts/mocks/CurationMock.sol @@ -2,17 +2,38 @@ pragma solidity 0.8.27; +/** + * @title CurationMock + * @author Edge & Node + * @notice Mock implementation of curation functionality for testing + */ contract CurationMock { + /// @notice Mapping of subgraph deployment ID to curation tokens mapping(bytes32 subgraphDeploymentID => uint256 tokens) public curation; + /** + * @notice Signal curation tokens for a subgraph deployment + * @param subgraphDeploymentID The subgraph deployment ID + * @param tokens The amount of tokens to signal + */ function signal(bytes32 subgraphDeploymentID, uint256 tokens) public { curation[subgraphDeploymentID] += tokens; } + /** + * @notice Check if a subgraph deployment is curated + * @param subgraphDeploymentID The subgraph deployment ID + * @return True if the subgraph deployment has curation tokens + */ function isCurated(bytes32 subgraphDeploymentID) public view returns (bool) { return curation[subgraphDeploymentID] != 0; } + /** + * @notice Collect curation tokens for a subgraph deployment + * @param subgraphDeploymentID The subgraph deployment ID + * @param tokens The amount of tokens to collect + */ function collect(bytes32 subgraphDeploymentID, uint256 tokens) external { curation[subgraphDeploymentID] += tokens; } diff --git a/packages/horizon/contracts/mocks/Dummy.sol b/packages/horizon/contracts/mocks/Dummy.sol index e6a575d0f..72b4e1a67 100644 --- a/packages/horizon/contracts/mocks/Dummy.sol +++ b/packages/horizon/contracts/mocks/Dummy.sol @@ -2,4 +2,9 @@ pragma solidity 0.8.27; +/** + * @title Dummy + * @author Edge & Node + * @notice Empty dummy contract for testing purposes + */ contract Dummy {} diff --git a/packages/horizon/contracts/mocks/EpochManagerMock.sol b/packages/horizon/contracts/mocks/EpochManagerMock.sol index 4c00fb29c..4030dc19c 100644 --- a/packages/horizon/contracts/mocks/EpochManagerMock.sol +++ b/packages/horizon/contracts/mocks/EpochManagerMock.sol @@ -4,16 +4,29 @@ pragma solidity 0.8.27; import { IEpochManager } from "@graphprotocol/interfaces/contracts/contracts/epochs/IEpochManager.sol"; +/** + * @title EpochManagerMock + * @author Edge & Node + * @notice Mock implementation of the EpochManager for testing + */ contract EpochManagerMock is IEpochManager { // -- Variables -- + /// @notice Length of an epoch in blocks uint256 public epochLength; + /// @notice Last epoch that was run uint256 public lastRunEpoch; + /// @notice Last epoch when the length was updated uint256 public lastLengthUpdateEpoch; + /// @notice Block number when the length was last updated uint256 public lastLengthUpdateBlock; // -- Configuration -- + /** + * @notice Set the epoch length + * @param epochLength_ New epoch length in blocks + */ function setEpochLength(uint256 epochLength_) public { lastLengthUpdateEpoch = 1; lastLengthUpdateBlock = blockNum(); @@ -22,41 +35,78 @@ contract EpochManagerMock is IEpochManager { // -- Epochs + /** + * @notice Run the current epoch + */ function runEpoch() public { lastRunEpoch = currentEpoch(); } // -- Getters -- + /** + * @notice Check if the current epoch has been run + * @return True if the current epoch has been run + */ function isCurrentEpochRun() public view returns (bool) { return lastRunEpoch == currentEpoch(); } + /** + * @notice Get the current block number + * @return The current block number + */ function blockNum() public view returns (uint256) { return block.number; } + /** + * @notice Get the hash of a specific block + * @param block_ Block number to get hash for + * @return The block hash + */ function blockHash(uint256 block_) public view returns (bytes32) { return blockhash(block_); } + /** + * @notice Get the current epoch number + * @return The current epoch number + */ function currentEpoch() public view returns (uint256) { return lastLengthUpdateEpoch + epochsSinceUpdate(); } + /** + * @notice Get the block number when the current epoch started + * @return The block number when the current epoch started + */ function currentEpochBlock() public view returns (uint256) { return lastLengthUpdateBlock + (epochsSinceUpdate() * epochLength); } + /** + * @notice Get the number of blocks since the current epoch started + * @return The number of blocks since the current epoch started + */ function currentEpochBlockSinceStart() public view returns (uint256) { return blockNum() - currentEpochBlock(); } + /** + * @notice Get the number of epochs since a given epoch + * @param epoch_ The epoch to compare against + * @return The number of epochs since the given epoch + */ function epochsSince(uint256 epoch_) public view returns (uint256) { uint256 epoch = currentEpoch(); return epoch_ < epoch ? (epoch - epoch_) : 0; } + /** + * @notice Get the number of epochs since the last length update + * @return The number of epochs since the last length update + */ function epochsSinceUpdate() public view returns (uint256) { return (blockNum() - lastLengthUpdateBlock) / epochLength; } diff --git a/packages/horizon/contracts/mocks/MockGRTToken.sol b/packages/horizon/contracts/mocks/MockGRTToken.sol index 235999ae5..385b3b4e2 100644 --- a/packages/horizon/contracts/mocks/MockGRTToken.sol +++ b/packages/horizon/contracts/mocks/MockGRTToken.sol @@ -4,27 +4,65 @@ pragma solidity 0.8.27; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; +/** + * @title MockGRTToken + * @author Edge & Node + * @notice Mock implementation of the Graph Token for testing + */ contract MockGRTToken is ERC20, IGraphToken { + /** + * @notice Constructor for the MockGRTToken + */ constructor() ERC20("Graph Token", "GRT") {} + /** + * @notice Burn tokens from the caller's account + * @param tokens Amount of tokens to burn + */ function burn(uint256 tokens) external { _burn(msg.sender, tokens); } + /** + * @notice Burn tokens from a specific account + * @param from Account to burn tokens from + * @param tokens Amount of tokens to burn + */ function burnFrom(address from, uint256 tokens) external { _burn(from, tokens); } // -- Mint Admin -- + /** + * @notice Add a minter (mock implementation - does nothing) + * @param account Account to add as minter + */ function addMinter(address account) external {} + /** + * @notice Remove a minter (mock implementation - does nothing) + * @param account Account to remove as minter + */ function removeMinter(address account) external {} + /** + * @notice Renounce minter role (mock implementation - does nothing) + */ function renounceMinter() external {} // -- Permit -- + /** + * @notice Permit function for gasless approvals (mock implementation - does nothing) + * @param owner Token owner + * @param spender Spender address + * @param value Amount to approve + * @param deadline Deadline for the permit + * @param v Recovery byte of the signature + * @param r First 32 bytes of the signature + * @param s Second 32 bytes of the signature + */ function permit( address owner, address spender, @@ -37,12 +75,34 @@ contract MockGRTToken is ERC20, IGraphToken { // -- Allowance -- + /** + * @notice Increase allowance (mock implementation - does nothing) + * @param spender Spender address + * @param addedValue Amount to add to allowance + * @return Always returns false in mock + */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {} + /** + * @notice Decrease allowance (mock implementation - does nothing) + * @param spender Spender address + * @param subtractedValue Amount to subtract from allowance + * @return Always returns false in mock + */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {} + /** + * @notice Check if an account is a minter (mock implementation - always returns false) + * @param account Account to check + * @return Always returns false in mock + */ function isMinter(address account) external view returns (bool) {} + /** + * @notice Mint tokens to an account + * @param to Account to mint tokens to + * @param tokens Amount of tokens to mint + */ function mint(address to, uint256 tokens) public { _mint(to, tokens); } diff --git a/packages/horizon/contracts/mocks/RewardsManagerMock.sol b/packages/horizon/contracts/mocks/RewardsManagerMock.sol index 300e7efe2..89f4a7e4a 100644 --- a/packages/horizon/contracts/mocks/RewardsManagerMock.sol +++ b/packages/horizon/contracts/mocks/RewardsManagerMock.sol @@ -4,23 +4,51 @@ pragma solidity 0.8.27; import { MockGRTToken } from "./MockGRTToken.sol"; +/** + * @title RewardsManagerMock + * @author Edge & Node + * @notice Mock implementation of the RewardsManager for testing + */ contract RewardsManagerMock { // -- Variables -- + /// @notice The mock GRT token contract MockGRTToken public token; uint256 private _rewards; // -- Constructor -- + /** + * @notice Constructor for the RewardsManager mock + * @param token_ The mock GRT token contract + * @param rewards The amount of rewards to distribute + */ constructor(MockGRTToken token_, uint256 rewards) { token = token_; _rewards = rewards; } - function takeRewards(address) external returns (uint256) { + /** + * @notice Take rewards for an allocation + * @param allocationID The allocation ID (unused in mock) + * @return The amount of rewards taken + */ + function takeRewards(address allocationID) external returns (uint256) { + // solhint-disable-previous-line no-unused-vars token.mint(msg.sender, _rewards); return _rewards; } - function onSubgraphAllocationUpdate(bytes32) public returns (uint256) {} + /** + * @notice Handle subgraph allocation update (mock implementation) + * @param subgraphDeploymentID The subgraph deployment ID + * @return Always returns 0 in mock + */ + function onSubgraphAllocationUpdate(bytes32 subgraphDeploymentID) public returns (uint256) {} + + /** + * @notice Handle subgraph signal update (mock implementation) + * @param subgraphDeploymentID The subgraph deployment ID + * @return Always returns 0 in mock + */ function onSubgraphSignalUpdate(bytes32 subgraphDeploymentID) external returns (uint256) {} } diff --git a/packages/horizon/contracts/payments/GraphPayments.sol b/packages/horizon/contracts/payments/GraphPayments.sol index e82758b0e..f8268efca 100644 --- a/packages/horizon/contracts/payments/GraphPayments.sol +++ b/packages/horizon/contracts/payments/GraphPayments.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines + import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; @@ -14,6 +17,7 @@ import { GraphDirectory } from "../utilities/GraphDirectory.sol"; /** * @title GraphPayments contract + * @author Edge & Node * @notice This contract is part of the Graph Horizon payments protocol. It's designed * to pull funds (GRT) from the {PaymentsEscrow} and distribute them according to a * set of pre established rules. diff --git a/packages/horizon/contracts/payments/PaymentsEscrow.sol b/packages/horizon/contracts/payments/PaymentsEscrow.sol index bcced0412..c36b9bd73 100644 --- a/packages/horizon/contracts/payments/PaymentsEscrow.sol +++ b/packages/horizon/contracts/payments/PaymentsEscrow.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; @@ -13,6 +16,7 @@ import { GraphDirectory } from "../utilities/GraphDirectory.sol"; /** * @title PaymentsEscrow contract + * @author Edge & Node * @dev Implements the {IPaymentsEscrow} interface * @notice This contract is part of the Graph Horizon payments protocol. It holds the funds (GRT) * for payments made through the payments protocol for services provided diff --git a/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol b/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol index 0ede499e0..eb33d931c 100644 --- a/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol +++ b/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings +// solhint-disable gas-strict-inequalities +// solhint-disable function-max-lines + import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; import { IPaymentsCollector } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsCollector.sol"; @@ -14,6 +19,7 @@ import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /** * @title GraphTallyCollector contract + * @author Edge & Node * @dev Implements the {IGraphTallyCollector}, {IPaymentCollector} and {IAuthorizable} interfaces. * @notice A payments collector contract that can be used to collect payments using a GraphTally RAV (Receipt Aggregate Voucher). * @dev Note that the contract expects the RAV aggregate value to be monotonically increasing, each successive RAV for the same @@ -185,9 +191,9 @@ contract GraphTallyCollector is EIP712, GraphDirectory, Authorizable, IGraphTall } /** - * @dev Recovers the signer address of a signed ReceiptAggregateVoucher (RAV). - * @param _signedRAV The SignedRAV containing the RAV and its signature. - * @return The address of the signer. + * @notice Recovers the signer address of a signed ReceiptAggregateVoucher (RAV) + * @param _signedRAV The SignedRAV containing the RAV and its signature + * @return The address of the signer */ function _recoverRAVSigner(SignedRAV memory _signedRAV) private view returns (address) { bytes32 messageHash = _encodeRAV(_signedRAV.rav); @@ -195,9 +201,9 @@ contract GraphTallyCollector is EIP712, GraphDirectory, Authorizable, IGraphTall } /** - * @dev Computes the hash of a ReceiptAggregateVoucher (RAV). - * @param _rav The RAV for which to compute the hash. - * @return The hash of the RAV. + * @notice Computes the hash of a ReceiptAggregateVoucher (RAV) + * @param _rav The RAV for which to compute the hash + * @return The hash of the RAV */ function _encodeRAV(ReceiptAggregateVoucher memory _rav) private view returns (bytes32) { return diff --git a/packages/horizon/contracts/staking/HorizonStaking.sol b/packages/horizon/contracts/staking/HorizonStaking.sol index ff675fdd6..1c3e2e8af 100644 --- a/packages/horizon/contracts/staking/HorizonStaking.sol +++ b/packages/horizon/contracts/staking/HorizonStaking.sol @@ -1,5 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities +// solhint-disable gas-increment-by-one +// solhint-disable function-max-lines + pragma solidity 0.8.27; import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; @@ -17,6 +22,7 @@ import { HorizonStakingBase } from "./HorizonStakingBase.sol"; /** * @title HorizonStaking contract + * @author Edge & Node * @notice The {HorizonStaking} contract allows service providers to stake and provision tokens to verifiers to be used * as economic security for a service. It also allows delegators to delegate towards a service provider provision. * @dev Implements the {IHorizonStakingMain} interface. @@ -69,11 +75,10 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain { } /** - * @dev The staking contract is upgradeable however we still use the constructor to set - * a few immutable variables. - * @param controller The address of the Graph controller contract. - * @param stakingExtensionAddress The address of the staking extension contract. - * @param subgraphDataServiceAddress The address of the subgraph data service. + * @notice The staking contract is upgradeable however we still use the constructor to set a few immutable variables + * @param controller The address of the Graph controller contract + * @param stakingExtensionAddress The address of the staking extension contract + * @param subgraphDataServiceAddress The address of the subgraph data service */ constructor( address controller, @@ -88,8 +93,8 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain { * @dev This function does not return to its internal call site, it will return directly to the * external caller. */ - // solhint-disable-next-line payable-fallback, no-complex-fallback fallback() external { + // solhint-disable-previous-line payable-fallback, no-complex-fallback address extensionImpl = STAKING_EXTENSION_ADDRESS; // solhint-disable-next-line no-inline-assembly assembly { @@ -681,8 +686,8 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain { * @dev TRANSITION PERIOD: During the transition period, only the subgraph data service can be used as a verifier. This * prevents an escape hatch for legacy allocation stake. * @param _serviceProvider The service provider address - * @param _verifier The verifier address for which the tokens are provisioned (who will be able to slash the tokens) * @param _tokens The amount of tokens that will be locked and slashable + * @param _verifier The verifier address for which the tokens are provisioned (who will be able to slash the tokens) * @param _maxVerifierCut The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing * @param _thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision */ diff --git a/packages/horizon/contracts/staking/HorizonStakingBase.sol b/packages/horizon/contracts/staking/HorizonStakingBase.sol index 2428e1e98..9c52a2171 100644 --- a/packages/horizon/contracts/staking/HorizonStakingBase.sol +++ b/packages/horizon/contracts/staking/HorizonStakingBase.sol @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + pragma solidity 0.8.27; import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; @@ -17,6 +20,7 @@ import { HorizonStakingV1Storage } from "./HorizonStakingStorage.sol"; /** * @title HorizonStakingBase contract + * @author Edge & Node * @notice This contract is the base staking contract implementing storage getters for both internal * and external use. * @dev Implementation of the {IHorizonStakingBase} interface. @@ -42,10 +46,9 @@ abstract contract HorizonStakingBase is address internal immutable SUBGRAPH_DATA_SERVICE_ADDRESS; /** - * @dev The staking contract is upgradeable however we still use the constructor to set - * a few immutable variables. - * @param controller The address of the Graph controller contract. - * @param subgraphDataServiceAddress The address of the subgraph data service. + * @notice The staking contract is upgradeable however we still use the constructor to set a few immutable variables + * @param controller The address of the Graph controller contract + * @param subgraphDataServiceAddress The address of the subgraph data service */ constructor(address controller, address subgraphDataServiceAddress) Managed(controller) { SUBGRAPH_DATA_SERVICE_ADDRESS = subgraphDataServiceAddress; diff --git a/packages/horizon/contracts/staking/HorizonStakingExtension.sol b/packages/horizon/contracts/staking/HorizonStakingExtension.sol index 3480a5c4d..f000ee1ba 100644 --- a/packages/horizon/contracts/staking/HorizonStakingExtension.sol +++ b/packages/horizon/contracts/staking/HorizonStakingExtension.sol @@ -1,5 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities +// solhint-disable gas-increment-by-one +// solhint-disable function-max-lines + pragma solidity 0.8.27; import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curation/ICuration.sol"; @@ -16,6 +21,7 @@ import { HorizonStakingBase } from "./HorizonStakingBase.sol"; /** * @title Horizon Staking extension contract + * @author Edge & Node * @notice The {HorizonStakingExtension} contract implements the legacy functionality required to support the transition * to the Horizon Staking contract. It allows indexers to close allocations and collect pending query fees, but it * does not allow for the creation of new allocations. This should allow indexers to migrate to a subgraph data service @@ -39,10 +45,9 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev The staking contract is upgradeable however we still use the constructor to set - * a few immutable variables. - * @param controller The address of the Graph controller contract. - * @param subgraphDataServiceAddress The address of the subgraph data service. + * @notice The staking contract is upgradeable however we still use the constructor to set a few immutable variables + * @param controller The address of the Graph controller contract + * @param subgraphDataServiceAddress The address of the subgraph data service */ constructor( address controller, @@ -265,7 +270,7 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Collect tax to burn for an amount of tokens. + * @notice Collect tax to burn for an amount of tokens * @param _tokens Total tokens received used to calculate the amount of tax to collect * @param _percentage Percentage of tokens to burn as tax * @return Amount of tax charged @@ -277,7 +282,7 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Triggers an update of rewards due to a change in allocations. + * @notice Triggers an update of rewards due to a change in allocations * @param _subgraphDeploymentID Subgraph deployment updated */ function _updateRewards(bytes32 _subgraphDeploymentID) private { @@ -285,7 +290,7 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Assign rewards for the closed allocation to indexer and delegators. + * @notice Assign rewards for the closed allocation to indexer and delegators * @param _allocationID Allocation * @param _indexer Address of the indexer that did the allocation */ @@ -307,7 +312,7 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Send rewards to the appropriate destination. + * @notice Send rewards to the appropriate destination * @param _tokens Number of rewards tokens * @param _beneficiary Address of the beneficiary of rewards * @param _restake Whether to restake or not @@ -326,7 +331,7 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Close an allocation and free the staked tokens. + * @notice Close an allocation and free the staked tokens * @param _allocationID The allocation identifier * @param _poi Proof of indexing submitted for the allocated period */ @@ -390,8 +395,8 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Collect the delegation rewards for query fees. - * This function will assign the collected fees to the delegation pool. + * @notice Collect the delegation rewards for query fees + * @dev This function will assign the collected fees to the delegation pool * @param _indexer Indexer to which the tokens to distribute are related * @param _tokens Total tokens received used to calculate the amount of fees to collect * @return Amount of delegation rewards @@ -408,8 +413,8 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Collect the delegation rewards for indexing. - * This function will assign the collected fees to the delegation pool. + * @notice Collect the delegation rewards for indexing + * @dev This function will assign the collected fees to the delegation pool * @param _indexer Indexer to which the tokens to distribute are related * @param _tokens Total tokens received used to calculate the amount of fees to collect * @return Amount of delegation rewards @@ -426,8 +431,8 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Collect the curation fees for a subgraph deployment from an amount of tokens. - * This function transfer curation fees to the Curation contract by calling Curation.collect + * @notice Collect the curation fees for a subgraph deployment from an amount of tokens + * @dev This function transfer curation fees to the Curation contract by calling Curation.collect * @param _subgraphDeploymentID Subgraph deployment to which the curation fees are related * @param _tokens Total tokens received used to calculate the amount of fees to collect * @param _curationCut Percentage of tokens to collect as fees @@ -461,7 +466,7 @@ contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension } /** - * @dev Return the current state of an allocation + * @notice Return the current state of an allocation * @param _allocationID Allocation identifier * @return AllocationState enum with the state of the allocation */ diff --git a/packages/horizon/contracts/staking/HorizonStakingStorage.sol b/packages/horizon/contracts/staking/HorizonStakingStorage.sol index 19dc65f11..5f63af9df 100644 --- a/packages/horizon/contracts/staking/HorizonStakingStorage.sol +++ b/packages/horizon/contracts/staking/HorizonStakingStorage.sol @@ -11,7 +11,8 @@ import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/interna /** * @title HorizonStakingV1Storage - * @notice This contract holds all the storage variables for the Staking contract. + * @author Edge & Node + * @notice This contract holds all the storage variables for the Staking contract * @dev Deprecated variables are kept to support the transition to Horizon Staking. * They can eventually be collapsed into a single storage slot. * @custom:security-contact Please email security+contracts@thegraph.com if you find any diff --git a/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol b/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol index b137079b3..974e7197b 100644 --- a/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol +++ b/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol @@ -6,6 +6,7 @@ import { LibFixedMath } from "../../libraries/LibFixedMath.sol"; /** * @title ExponentialRebates library + * @author Edge & Node * @notice A library to compute query fee rebates using an exponential formula * @dev This is only used for backwards compatibility in HorizonStaking, and should * be removed after the transition period. @@ -16,21 +17,22 @@ library ExponentialRebates { /// @dev Maximum value of the exponent for which to compute the exponential before clamping to zero. uint32 private constant MAX_EXPONENT = 15; - /// @dev The exponential formula used to compute fee-based rewards for - /// staking pools in a given epoch. This function does not perform - /// bounds checking on the inputs, but the following conditions - /// need to be true: - /// 0 <= alphaNumerator / alphaDenominator <= 1 - /// 0 < lambdaNumerator / lambdaDenominator - /// The exponential rebates function has the form: - /// `(1 - alpha * exp ^ (-lambda * stake / fees)) * fees` - /// @param fees Fees generated by indexer in the staking pool. - /// @param stake Stake attributed to the indexer in the staking pool. - /// @param alphaNumerator Numerator of `alpha` in the rebates function. - /// @param alphaDenominator Denominator of `alpha` in the rebates function. - /// @param lambdaNumerator Numerator of `lambda` in the rebates function. - /// @param lambdaDenominator Denominator of `lambda` in the rebates function. - /// @return rewards Rewards owed to the staking pool. + /** + * @notice The exponential formula used to compute fee-based rewards for staking pools in a given epoch + * @dev This function does not perform bounds checking on the inputs, but the following conditions + * need to be true: + * 0 <= alphaNumerator / alphaDenominator <= 1 + * 0 < lambdaNumerator / lambdaDenominator + * The exponential rebates function has the form: + * `(1 - alpha * exp ^ (-lambda * stake / fees)) * fees` + * @param fees Fees generated by indexer in the staking pool + * @param stake Stake attributed to the indexer in the staking pool + * @param alphaNumerator Numerator of `alpha` in the rebates function + * @param alphaDenominator Denominator of `alpha` in the rebates function + * @param lambdaNumerator Numerator of `lambda` in the rebates function + * @param lambdaDenominator Denominator of `lambda` in the rebates function + * @return rewards Rewards owed to the staking pool + */ function exponentialRebates( uint256 fees, uint256 stake, diff --git a/packages/horizon/contracts/staking/utilities/Managed.sol b/packages/horizon/contracts/staking/utilities/Managed.sol index b2e36056f..88d2fb7c1 100644 --- a/packages/horizon/contracts/staking/utilities/Managed.sol +++ b/packages/horizon/contracts/staking/utilities/Managed.sol @@ -8,8 +8,9 @@ import { GraphDirectory } from "../../utilities/GraphDirectory.sol"; /** * @title Graph Managed contract - * @dev The Managed contract provides an interface to interact with the Controller. - * For Graph Horizon this contract is mostly a shell that uses {GraphDirectory}, however since the {HorizonStaking} + * @author Edge & Node + * @notice The Managed contract provides an interface to interact with the Controller + * @dev For Graph Horizon this contract is mostly a shell that uses {GraphDirectory}, however since the {HorizonStaking} * contract uses it we need to preserve the storage layout. * Inspired by Livepeer: https://github.com/livepeer/protocol/blob/streamflow/contracts/Controller.sol * @custom:security-contact Please email security+contracts@thegraph.com if you find any @@ -59,8 +60,8 @@ abstract contract Managed is GraphDirectory { } /** - * @dev Initialize the contract - * @param controller_ The address of the Graph controller contract. + * @notice Initialize the contract + * @param controller_ The address of the Graph controller contract */ constructor(address controller_) GraphDirectory(controller_) {} } diff --git a/packages/horizon/contracts/utilities/Authorizable.sol b/packages/horizon/contracts/utilities/Authorizable.sol index 3c77e951e..6af2e677f 100644 --- a/packages/horizon/contracts/utilities/Authorizable.sol +++ b/packages/horizon/contracts/utilities/Authorizable.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; @@ -8,6 +11,7 @@ import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/Mes /** * @title Authorizable contract + * @author Edge & Node * @dev Implements the {IAuthorizable} interface. * @notice A mechanism to authorize signers to sign messages on behalf of an authorizer. * Signers cannot be reused for different authorizers. diff --git a/packages/horizon/contracts/utilities/GraphDirectory.sol b/packages/horizon/contracts/utilities/GraphDirectory.sol index 469410c8b..1071605d9 100644 --- a/packages/horizon/contracts/utilities/GraphDirectory.sol +++ b/packages/horizon/contracts/utilities/GraphDirectory.sol @@ -17,6 +17,7 @@ import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curatio /** * @title GraphDirectory contract + * @author Edge & Node * @notice This contract is meant to be inherited by other contracts that * need to keep track of the addresses in Graph Horizon contracts. * It fetches the addresses from the Controller supplied during construction, diff --git a/packages/interfaces/contracts/contracts/arbitrum/IArbToken.sol b/packages/interfaces/contracts/contracts/arbitrum/IArbToken.sol index 35fd7beb3..a45f948f9 100644 --- a/packages/interfaces/contracts/contracts/arbitrum/IArbToken.sol +++ b/packages/interfaces/contracts/contracts/arbitrum/IArbToken.sol @@ -29,18 +29,28 @@ */ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Arbitrum Token Interface + * @author Edge & Node + * @notice Interface for tokens that can be minted and burned on Arbitrum L2 + */ interface IArbToken { /** * @notice should increase token supply by amount, and should (probably) only be callable by the L1 bridge. + * @param account Account to mint tokens to + * @param amount Amount of tokens to mint */ function bridgeMint(address account, uint256 amount) external; /** * @notice should decrease token supply by amount, and should (probably) only be callable by the L1 bridge. + * @param account Account to burn tokens from + * @param amount Amount of tokens to burn */ function bridgeBurn(address account, uint256 amount) external; /** + * @notice Get the L1 token address * @return address of layer 1 token */ function l1Address() external view returns (address); diff --git a/packages/interfaces/contracts/contracts/arbitrum/IBridge.sol b/packages/interfaces/contracts/contracts/arbitrum/IBridge.sol index 791c2b1a1..d49695069 100644 --- a/packages/interfaces/contracts/contracts/arbitrum/IBridge.sol +++ b/packages/interfaces/contracts/contracts/arbitrum/IBridge.sol @@ -25,7 +25,24 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + +/** + * @title Bridge Interface + * @author Edge & Node + * @notice Interface for the Arbitrum Bridge contract + */ interface IBridge { + /** + * @notice Emitted when a message is delivered to the inbox + * @param messageIndex Index of the message + * @param beforeInboxAcc Inbox accumulator before this message + * @param inbox Address of the inbox + * @param kind Type of the message + * @param sender Address that sent the message + * @param messageDataHash Hash of the message data + */ event MessageDelivered( uint256 indexed messageIndex, bytes32 indexed beforeInboxAcc, @@ -35,38 +52,102 @@ interface IBridge { bytes32 messageDataHash ); + /** + * @notice Emitted when a bridge call is triggered + * @param outbox Address of the outbox + * @param destAddr Destination address for the call + * @param amount ETH amount sent with the call + * @param data Calldata for the function call + */ event BridgeCallTriggered(address indexed outbox, address indexed destAddr, uint256 amount, bytes data); + /** + * @notice Emitted when an inbox is enabled or disabled + * @param inbox Address of the inbox + * @param enabled Whether the inbox is enabled + */ event InboxToggle(address indexed inbox, bool enabled); + /** + * @notice Emitted when an outbox is enabled or disabled + * @param outbox Address of the outbox + * @param enabled Whether the outbox is enabled + */ event OutboxToggle(address indexed outbox, bool enabled); + /** + * @notice Deliver a message to the inbox + * @param kind Type of the message + * @param sender Address that is sending the message + * @param messageDataHash keccak256 hash of the message data + * @return The message index + */ function deliverMessageToInbox( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256); + /** + * @notice Execute a call from L2 to L1 + * @param destAddr Contract to call + * @param amount ETH value to send + * @param data Calldata for the function call + * @return success True if the call was successful, false otherwise + * @return returnData Return data from the call + */ function executeCall( address destAddr, uint256 amount, bytes calldata data ) external returns (bool success, bytes memory returnData); - // These are only callable by the admin + /** + * @notice Set the address of an inbox + * @param inbox Address of the inbox + * @param enabled Whether to enable the inbox + */ function setInbox(address inbox, bool enabled) external; + /** + * @notice Set the address of an outbox + * @param inbox Address of the outbox + * @param enabled Whether to enable the outbox + */ function setOutbox(address inbox, bool enabled) external; // View functions + /** + * @notice Get the active outbox address + * @return The active outbox address + */ function activeOutbox() external view returns (address); + /** + * @notice Check if an address is an allowed inbox + * @param inbox Address to check + * @return True if the address is an allowed inbox, false otherwise + */ function allowedInboxes(address inbox) external view returns (bool); + /** + * @notice Check if an address is an allowed outbox + * @param outbox Address to check + * @return True if the address is an allowed outbox, false otherwise + */ function allowedOutboxes(address outbox) external view returns (bool); + /** + * @notice Get the inbox accumulator at a specific index + * @param index Index to query + * @return The inbox accumulator at the given index + */ function inboxAccs(uint256 index) external view returns (bytes32); + /** + * @notice Get the count of messages in the inbox + * @return Number of messages in the inbox + */ function messageCount() external view returns (uint256); } diff --git a/packages/interfaces/contracts/contracts/arbitrum/IInbox.sol b/packages/interfaces/contracts/contracts/arbitrum/IInbox.sol index f216128cf..41ed88a65 100644 --- a/packages/interfaces/contracts/contracts/arbitrum/IInbox.sol +++ b/packages/interfaces/contracts/contracts/arbitrum/IInbox.sol @@ -28,9 +28,29 @@ pragma solidity ^0.7.6 || 0.8.27; import { IBridge } from "./IBridge.sol"; import { IMessageProvider } from "./IMessageProvider.sol"; +/** + * @title Inbox Interface + * @author Edge & Node + * @notice Interface for the Arbitrum Inbox contract + */ interface IInbox is IMessageProvider { + /** + * @notice Send a message to L2 + * @param messageData Encoded data to send in the message + * @return Message number returned by the inbox + */ function sendL2Message(bytes calldata messageData) external returns (uint256); + /** + * @notice Send an unsigned transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param nonce Nonce for the transaction + * @param destAddr Destination address on L2 + * @param amount Amount of ETH to send + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendUnsignedTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -40,6 +60,15 @@ interface IInbox is IMessageProvider { bytes calldata data ) external returns (uint256); + /** + * @notice Send a contract transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param destAddr Destination address on L2 + * @param amount Amount of ETH to send + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendContractTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -48,6 +77,15 @@ interface IInbox is IMessageProvider { bytes calldata data ) external returns (uint256); + /** + * @notice Send an L1-funded unsigned transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param nonce Nonce for the transaction + * @param destAddr Destination address on L2 + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendL1FundedUnsignedTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -56,6 +94,14 @@ interface IInbox is IMessageProvider { bytes calldata data ) external payable returns (uint256); + /** + * @notice Send an L1-funded contract transaction to L2 + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param destAddr Destination address on L2 + * @param data Transaction data + * @return Message number returned by the inbox + */ function sendL1FundedContractTransaction( uint256 maxGas, uint256 gasPriceBid, @@ -63,6 +109,18 @@ interface IInbox is IMessageProvider { bytes calldata data ) external payable returns (uint256); + /** + * @notice Create a retryable ticket for an L2 transaction + * @param destAddr Destination address on L2 + * @param arbTxCallValue Call value for the L2 transaction + * @param maxSubmissionCost Maximum cost for submitting the ticket + * @param submissionRefundAddress Address to refund submission cost to + * @param valueRefundAddress Address to refund excess value to + * @param maxGas Maximum gas for the L2 transaction + * @param gasPriceBid Gas price bid for the L2 transaction + * @param data Transaction data + * @return Message number returned by the inbox + */ function createRetryableTicket( address destAddr, uint256 arbTxCallValue, @@ -74,15 +132,36 @@ interface IInbox is IMessageProvider { bytes calldata data ) external payable returns (uint256); + /** + * @notice Deposit ETH to L2 + * @param maxSubmissionCost Maximum cost for submitting the deposit + * @return Message number returned by the inbox + */ function depositEth(uint256 maxSubmissionCost) external payable returns (uint256); + /** + * @notice Get the bridge contract + * @return The bridge contract address + */ function bridge() external view returns (IBridge); + /** + * @notice Pause the creation of retryable tickets + */ function pauseCreateRetryables() external; + /** + * @notice Unpause the creation of retryable tickets + */ function unpauseCreateRetryables() external; + /** + * @notice Start rewriting addresses + */ function startRewriteAddress() external; + /** + * @notice Stop rewriting addresses + */ function stopRewriteAddress() external; } diff --git a/packages/interfaces/contracts/contracts/arbitrum/IMessageProvider.sol b/packages/interfaces/contracts/contracts/arbitrum/IMessageProvider.sol index 50b674c70..98199f50c 100644 --- a/packages/interfaces/contracts/contracts/arbitrum/IMessageProvider.sol +++ b/packages/interfaces/contracts/contracts/arbitrum/IMessageProvider.sol @@ -25,8 +25,22 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Message Provider Interface + * @author Edge & Node + * @notice Interface for Arbitrum message providers + */ interface IMessageProvider { + /** + * @notice Emitted when a message is delivered to the inbox + * @param messageNum Message number + * @param data Message data + */ event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + /** + * @notice Emitted when a message is delivered from origin + * @param messageNum Message number + */ event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); } diff --git a/packages/interfaces/contracts/contracts/arbitrum/IOutbox.sol b/packages/interfaces/contracts/contracts/arbitrum/IOutbox.sol index 49617a976..3727f2f6b 100644 --- a/packages/interfaces/contracts/contracts/arbitrum/IOutbox.sol +++ b/packages/interfaces/contracts/contracts/arbitrum/IOutbox.sol @@ -25,13 +25,36 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + +/** + * @title Arbitrum Outbox Interface + * @author Edge & Node + * @notice Interface for the Arbitrum outbox contract + */ interface IOutbox { + /** + * @notice Emitted when an outbox entry is created + * @param batchNum Batch number + * @param outboxEntryIndex Index of the outbox entry + * @param outputRoot Output root hash + * @param numInBatch Number of messages in the batch + */ event OutboxEntryCreated( uint256 indexed batchNum, uint256 outboxEntryIndex, bytes32 outputRoot, uint256 numInBatch ); + + /** + * @notice Emitted when an outbox transaction is executed + * @param destAddr Destination address + * @param l2Sender L2 sender address + * @param outboxEntryIndex Index of the outbox entry + * @param transactionIndex Index of the transaction + */ event OutBoxTransactionExecuted( address indexed destAddr, address indexed l2Sender, @@ -39,19 +62,53 @@ interface IOutbox { uint256 transactionIndex ); + /** + * @notice Get the L2 to L1 sender address + * @return The sender address + */ function l2ToL1Sender() external view returns (address); + /** + * @notice Get the L2 to L1 block number + * @return The block number + */ function l2ToL1Block() external view returns (uint256); + /** + * @notice Get the L2 to L1 Ethereum block number + * @return The Ethereum block number + */ function l2ToL1EthBlock() external view returns (uint256); + /** + * @notice Get the L2 to L1 timestamp + * @return The timestamp + */ function l2ToL1Timestamp() external view returns (uint256); + /** + * @notice Get the L2 to L1 batch number + * @return The batch number + */ function l2ToL1BatchNum() external view returns (uint256); + /** + * @notice Get the L2 to L1 output ID + * @return The output ID + */ function l2ToL1OutputId() external view returns (bytes32); + /** + * @notice Process outgoing messages + * @param sendsData Encoded message data + * @param sendLengths Array of message lengths + */ function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths) external; + /** + * @notice Check if an outbox entry exists + * @param batchNum Batch number to check + * @return True if the entry exists + */ function outboxEntryExists(uint256 batchNum) external view returns (bool); } diff --git a/packages/interfaces/contracts/contracts/arbitrum/ITokenGateway.sol b/packages/interfaces/contracts/contracts/arbitrum/ITokenGateway.sol index 3b12e578e..2a0d1a2f3 100644 --- a/packages/interfaces/contracts/contracts/arbitrum/ITokenGateway.sol +++ b/packages/interfaces/contracts/contracts/arbitrum/ITokenGateway.sol @@ -25,6 +25,11 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Token Gateway Interface + * @author Edge & Node + * @notice Interface for token gateways that handle cross-chain token transfers + */ interface ITokenGateway { /// @notice event deprecated in favor of DepositInitiated and WithdrawalInitiated // event OutboundTransferInitiated( @@ -46,15 +51,33 @@ interface ITokenGateway { // bytes _data // ); + /** + * @notice Transfer tokens from L1 to L2 or L2 to L1 + * @param token Address of the token being transferred + * @param to Recipient address on the destination chain + * @param amount Amount of tokens to transfer + * @param maxGas Maximum gas for the transaction + * @param gasPriceBid Gas price bid for the transaction + * @param data Additional data for the transfer + * @return Transaction data + */ function outboundTransfer( address token, address to, - uint256 amunt, - uint256 maxas, - uint256 gasPiceBid, + uint256 amount, + uint256 maxGas, + uint256 gasPriceBid, bytes calldata data ) external payable returns (bytes memory); + /** + * @notice Finalize an inbound token transfer + * @param token Address of the token being transferred + * @param from Sender address on the source chain + * @param to Recipient address on the destination chain + * @param amount Amount of tokens being transferred + * @param data Additional data for the transfer + */ function finalizeInboundTransfer( address token, address from, diff --git a/packages/interfaces/contracts/contracts/base/IMulticall.sol b/packages/interfaces/contracts/contracts/base/IMulticall.sol index 10f7fa469..07f40ea36 100644 --- a/packages/interfaces/contracts/contracts/base/IMulticall.sol +++ b/packages/interfaces/contracts/contracts/base/IMulticall.sol @@ -5,6 +5,7 @@ pragma abicoder v2; /** * @title Multicall interface + * @author Edge & Node * @notice Enables calling multiple methods in a single call to the contract */ interface IMulticall { diff --git a/packages/interfaces/contracts/contracts/curation/ICuration.sol b/packages/interfaces/contracts/contracts/curation/ICuration.sol index cb6271991..91227f23a 100644 --- a/packages/interfaces/contracts/contracts/curation/ICuration.sol +++ b/packages/interfaces/contracts/contracts/curation/ICuration.sol @@ -4,7 +4,8 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Curation Interface - * @dev Interface for the Curation contract (and L2Curation too) + * @author Edge & Node + * @notice Interface for the Curation contract (and L2Curation too) */ interface ICuration { // -- Configuration -- diff --git a/packages/interfaces/contracts/contracts/curation/IGraphCurationToken.sol b/packages/interfaces/contracts/contracts/curation/IGraphCurationToken.sol index 644593f54..d83fce16a 100644 --- a/packages/interfaces/contracts/contracts/curation/IGraphCurationToken.sol +++ b/packages/interfaces/contracts/contracts/curation/IGraphCurationToken.sol @@ -4,10 +4,29 @@ pragma solidity ^0.7.6 || 0.8.27; import { IERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +/** + * @title Graph Curation Token Interface + * @author Edge & Node + * @notice Interface for curation tokens that represent shares in subgraph curation pools + */ interface IGraphCurationToken is IERC20Upgradeable { + /** + * @notice Graph Curation Token Contract initializer. + * @param owner Address of the contract issuing this token + */ function initialize(address owner) external; + /** + * @notice Burn tokens from an address. + * @param account Address from where tokens will be burned + * @param amount Amount of tokens to burn + */ function burnFrom(address account, uint256 amount) external; + /** + * @notice Mint new tokens. + * @param to Address to send the newly minted tokens + * @param amount Amount of tokens to mint + */ function mint(address to, uint256 amount) external; } diff --git a/packages/interfaces/contracts/contracts/discovery/IGNS.sol b/packages/interfaces/contracts/contracts/discovery/IGNS.sol index 6c00ce694..c502cd7af 100644 --- a/packages/interfaces/contracts/contracts/discovery/IGNS.sol +++ b/packages/interfaces/contracts/contracts/discovery/IGNS.sol @@ -4,6 +4,8 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Interface for GNS + * @author Edge & Node + * @notice Interface for the Graph Name System (GNS) contract */ interface IGNS { // -- Pool -- @@ -12,6 +14,13 @@ interface IGNS { * @dev The SubgraphData struct holds information about subgraphs * and their signal; both nSignal (i.e. name signal at the GNS level) * and vSignal (i.e. version signal at the Curation contract level) + * @param vSignal The token of the subgraph-deployment bonding curve + * @param nSignal The token of the subgraph bonding curve + * @param curatorNSignal Mapping of curator addresses to their name signal amounts + * @param subgraphDeploymentID The deployment ID this subgraph points to + * @param __DEPRECATED_reserveRatio Deprecated reserve ratio field + * @param disabled Whether the subgraph is disabled/deprecated + * @param withdrawableGRT Amount of GRT available for withdrawal after deprecation */ struct SubgraphData { uint256 vSignal; // The token of the subgraph-deployment bonding curve @@ -26,6 +35,8 @@ interface IGNS { /** * @dev The LegacySubgraphKey struct holds the account and sequence ID * used to generate subgraph IDs in legacy subgraphs. + * @param account The account that created the legacy subgraph + * @param accountSeqID The sequence ID for the account's subgraphs */ struct LegacySubgraphKey { address account; @@ -35,7 +46,10 @@ interface IGNS { // -- Events -- /** - * @dev Emitted when a subgraph version is updated. + * @notice Emitted when a subgraph version is updated. + * @param subgraphID The subgraph ID + * @param subgraphDeploymentID The subgraph deployment ID + * @param versionMetadata The version metadata */ event SubgraphVersionUpdated( uint256 indexed subgraphID, @@ -127,7 +141,7 @@ interface IGNS { function burnSignal(uint256 subgraphID, uint256 nSignal, uint256 tokensOutMin) external; /** - * @notice Move subgraph signal from sender to recipient + * @notice Move subgraph signal from sender to `recipient` * @param subgraphID Subgraph ID * @param recipient Address to send the signal to * @param amount The amount of nSignal to transfer @@ -169,7 +183,9 @@ interface IGNS { * @notice Calculate subgraph signal to be returned for an amount of tokens. * @param subgraphID Subgraph ID * @param tokensIn Tokens being exchanged for subgraph signal - * @return Amount of subgraph signal and curation tax + * @return Amount of subgraph signal that can be bought + * @return Amount of version signal that can be bought + * @return Amount of curation tax */ function tokensToNSignal(uint256 subgraphID, uint256 tokensIn) external view returns (uint256, uint256, uint256); @@ -178,6 +194,7 @@ interface IGNS { * @param subgraphID Subgraph ID * @param nSignalIn Subgraph signal being exchanged for tokens * @return Amount of tokens returned for an amount of subgraph signal + * @return Amount of version signal returned */ function nSignalToTokens(uint256 subgraphID, uint256 nSignalIn) external view returns (uint256, uint256); diff --git a/packages/interfaces/contracts/contracts/discovery/IServiceRegistry.sol b/packages/interfaces/contracts/contracts/discovery/IServiceRegistry.sol index b3f5377c0..1389fe015 100644 --- a/packages/interfaces/contracts/contracts/discovery/IServiceRegistry.sol +++ b/packages/interfaces/contracts/contracts/discovery/IServiceRegistry.sol @@ -2,19 +2,52 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Service Registry Interface + * @author Edge & Node + * @notice Interface for the Service Registry contract that manages indexer service information + */ interface IServiceRegistry { + /** + * @dev Indexer service information + * @param url URL of the indexer service + * @param geohash Geohash of the indexer service location + */ struct IndexerService { string url; string geohash; } + /** + * @notice Register an indexer service + * @param url URL of the indexer service + * @param geohash Geohash of the indexer service location + */ function register(string calldata url, string calldata geohash) external; + /** + * @notice Register an indexer service + * @param indexer Address of the indexer + * @param url URL of the indexer service + * @param geohash Geohash of the indexer service location + */ function registerFor(address indexer, string calldata url, string calldata geohash) external; + /** + * @notice Unregister an indexer service + */ function unregister() external; + /** + * @notice Unregister an indexer service + * @param indexer Address of the indexer + */ function unregisterFor(address indexer) external; + /** + * @notice Return the registration status of an indexer service + * @param indexer Address of the indexer + * @return True if the indexer service is registered + */ function isRegistered(address indexer) external view returns (bool); } diff --git a/packages/interfaces/contracts/contracts/discovery/ISubgraphNFT.sol b/packages/interfaces/contracts/contracts/discovery/ISubgraphNFT.sol index 0f7d5a73d..a3a9b659e 100644 --- a/packages/interfaces/contracts/contracts/discovery/ISubgraphNFT.sol +++ b/packages/interfaces/contracts/contracts/discovery/ISubgraphNFT.sol @@ -4,22 +4,64 @@ pragma solidity ^0.7.6 || 0.8.27; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +/** + * @title Subgraph NFT Interface + * @author Edge & Node + * @notice Interface for the Subgraph NFT contract that represents subgraph ownership + */ interface ISubgraphNFT is IERC721 { // -- Config -- + /** + * @notice Set the minter allowed to perform actions on the NFT + * @dev Minter can mint, burn and update the metadata + * @param minter Address of the allowed minter + */ function setMinter(address minter) external; + /** + * @notice Set the token descriptor contract + * @dev Token descriptor can be zero. If set, it must be a contract + * @param tokenDescriptor Address of the contract that creates the NFT token URI + */ function setTokenDescriptor(address tokenDescriptor) external; + /** + * @notice Set the base URI + * @dev Can be set to empty + * @param baseURI Base URI to use to build the token URI + */ function setBaseURI(string memory baseURI) external; // -- Actions -- + /** + * @notice Mint `tokenId` and transfers it to `to` + * @dev `tokenId` must not exist and `to` cannot be the zero address + * @param to Address receiving the minted NFT + * @param tokenId ID of the NFT + */ function mint(address to, uint256 tokenId) external; + /** + * @notice Burn `tokenId` + * @dev The approval is cleared when the token is burned + * @param tokenId ID of the NFT + */ function burn(uint256 tokenId) external; + /** + * @notice Set the metadata for a subgraph represented by `tokenId` + * @dev `tokenId` must exist + * @param tokenId ID of the NFT + * @param subgraphMetadata IPFS hash for the metadata + */ function setSubgraphMetadata(uint256 tokenId, bytes32 subgraphMetadata) external; + /** + * @notice Returns the Uniform Resource Identifier (URI) for `tokenId` token + * @param tokenId ID of the NFT + * @return The URI for the token + */ function tokenURI(uint256 tokenId) external view returns (string memory); } diff --git a/packages/interfaces/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol b/packages/interfaces/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol index 429e22898..3217b50df 100644 --- a/packages/interfaces/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol +++ b/packages/interfaces/contracts/contracts/discovery/ISubgraphNFTDescriptor.sol @@ -2,7 +2,11 @@ pragma solidity ^0.7.6 || 0.8.27; -/// @title Describes subgraph NFT tokens via URI +/** + * @title Describes subgraph NFT tokens via URI + * @author Edge & Node + * @notice Interface for describing subgraph NFT tokens via URI + */ interface ISubgraphNFTDescriptor { /// @notice Produces the URI describing a particular token ID for a Subgraph /// @dev Note this URI may be data: URI with the JSON contents directly inlined diff --git a/packages/interfaces/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol b/packages/interfaces/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol index c4bdf1ba8..18b084a18 100644 --- a/packages/interfaces/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol +++ b/packages/interfaces/contracts/contracts/discovery/erc1056/IEthereumDIDRegistry.sol @@ -2,8 +2,25 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Ethereum DID Registry Interface + * @author Edge & Node + * @notice Interface for the Ethereum DID Registry contract + */ interface IEthereumDIDRegistry { + /** + * @notice Get the owner of an identity + * @param identity The identity address + * @return The address of the identity owner + */ function identityOwner(address identity) external view returns (address); + /** + * @notice Set an attribute for an identity + * @param identity The identity address + * @param name The attribute name + * @param value The attribute value + * @param validity The validity period in seconds + */ function setAttribute(address identity, bytes32 name, bytes calldata value, uint256 validity) external; } diff --git a/packages/interfaces/contracts/contracts/disputes/IDisputeManager.sol b/packages/interfaces/contracts/contracts/disputes/IDisputeManager.sol index eb86be5d0..a9a1a94e5 100644 --- a/packages/interfaces/contracts/contracts/disputes/IDisputeManager.sol +++ b/packages/interfaces/contracts/contracts/disputes/IDisputeManager.sol @@ -3,15 +3,26 @@ pragma solidity >=0.6.12 <0.8.0 || 0.8.27; pragma abicoder v2; +/** + * @title Dispute Manager Interface + * @author Edge & Node + * @notice Interface for the Dispute Manager contract that handles indexing and query disputes + */ interface IDisputeManager { // -- Dispute -- + /** + * @dev Types of disputes that can be created + */ enum DisputeType { Null, IndexingDispute, QueryDispute } + /** + * @dev Status of a dispute + */ enum DisputeStatus { Null, Accepted, @@ -20,7 +31,15 @@ interface IDisputeManager { Pending } - // Disputes contain info necessary for the Arbitrator to verify and resolve + /** + * @dev Disputes contain info necessary for the Arbitrator to verify and resolve + * @param indexer Address of the indexer being disputed + * @param fisherman Address of the challenger creating the dispute + * @param deposit Amount of tokens staked as deposit + * @param relatedDisputeID ID of related dispute (for conflicting attestations) + * @param disputeType Type of dispute (Query or Indexing) + * @param status Current status of the dispute + */ struct Dispute { address indexer; address fisherman; @@ -32,14 +51,27 @@ interface IDisputeManager { // -- Attestation -- - // Receipt content sent from indexer in response to request + /** + * @dev Receipt content sent from indexer in response to request + * @param requestCID Content ID of the request + * @param responseCID Content ID of the response + * @param subgraphDeploymentID ID of the subgraph deployment + */ struct Receipt { bytes32 requestCID; bytes32 responseCID; bytes32 subgraphDeploymentID; } - // Attestation sent from indexer in response to a request + /** + * @dev Attestation sent from indexer in response to a request + * @param requestCID Content ID of the request + * @param responseCID Content ID of the response + * @param subgraphDeploymentID ID of the subgraph deployment + * @param r R component of the signature + * @param s S component of the signature + * @param v Recovery ID of the signature + */ struct Attestation { bytes32 requestCID; bytes32 responseCID; @@ -51,41 +83,121 @@ interface IDisputeManager { // -- Configuration -- + /** + * @dev Set the arbitrator address. + * @notice Update the arbitrator to `arbitrator` + * @param arbitrator The address of the arbitration contract or party + */ function setArbitrator(address arbitrator) external; + /** + * @dev Set the minimum deposit required to create a dispute. + * @notice Update the minimum deposit to `minimumDeposit` Graph Tokens + * @param minimumDeposit The minimum deposit in Graph Tokens + */ function setMinimumDeposit(uint256 minimumDeposit) external; + /** + * @dev Set the percent reward that the fisherman gets when slashing occurs. + * @notice Update the reward percentage to `percentage` + * @param percentage Reward as a percentage of indexer stake + */ function setFishermanRewardPercentage(uint32 percentage) external; + /** + * @notice Set the percentage used for slashing indexers. + * @param qryPercentage Percentage slashing for query disputes + * @param idxPercentage Percentage slashing for indexing disputes + */ function setSlashingPercentage(uint32 qryPercentage, uint32 idxPercentage) external; // -- Getters -- + /** + * @notice Check if a dispute has been created + * @param disputeID Dispute identifier + * @return True if the dispute exists + */ function isDisputeCreated(bytes32 disputeID) external view returns (bool); + /** + * @notice Encode a receipt into a hash for EIP-712 signature verification + * @param receipt The receipt to encode + * @return The encoded hash + */ function encodeHashReceipt(Receipt memory receipt) external view returns (bytes32); + /** + * @notice Check if two attestations are conflicting + * @param attestation1 First attestation + * @param attestation2 Second attestation + * @return True if attestations are conflicting + */ function areConflictingAttestations( Attestation memory attestation1, Attestation memory attestation2 ) external pure returns (bool); + /** + * @notice Get the indexer address from an attestation + * @param attestation The attestation to extract indexer from + * @return The indexer address + */ function getAttestationIndexer(Attestation memory attestation) external view returns (address); // -- Dispute -- + /** + * @notice Create a query dispute for the arbitrator to resolve. + * This function is called by a fisherman that will need to `deposit` at + * least `minimumDeposit` GRT tokens. + * @param attestationData Attestation bytes submitted by the fisherman + * @param deposit Amount of tokens staked as deposit + * @return The dispute ID + */ function createQueryDispute(bytes calldata attestationData, uint256 deposit) external returns (bytes32); + /** + * @notice Create query disputes for two conflicting attestations. + * A conflicting attestation is a proof presented by two different indexers + * where for the same request on a subgraph the response is different. + * For this type of dispute the submitter is not required to present a deposit + * as one of the attestation is considered to be right. + * Two linked disputes will be created and if the arbitrator resolve one, the other + * one will be automatically resolved. + * @param attestationData1 First attestation data submitted + * @param attestationData2 Second attestation data submitted + * @return First dispute ID + * @return Second dispute ID + */ function createQueryDisputeConflict( bytes calldata attestationData1, bytes calldata attestationData2 ) external returns (bytes32, bytes32); + /** + * @notice Create an indexing dispute + * @param allocationID Allocation ID being disputed + * @param deposit Deposit amount for the dispute + * @return The dispute ID + */ function createIndexingDispute(address allocationID, uint256 deposit) external returns (bytes32); + /** + * @notice Accept a dispute (arbitrator only) + * @param disputeID ID of the dispute to accept + */ function acceptDispute(bytes32 disputeID) external; + /** + * @notice Reject a dispute (arbitrator only) + * @param disputeID ID of the dispute to reject + */ function rejectDispute(bytes32 disputeID) external; + /** + * @notice Draw a dispute (arbitrator only) + * @param disputeID ID of the dispute to draw + */ function drawDispute(bytes32 disputeID) external; } diff --git a/packages/interfaces/contracts/contracts/epochs/IEpochManager.sol b/packages/interfaces/contracts/contracts/epochs/IEpochManager.sol index 06f3fd70a..b7f3e0ab5 100644 --- a/packages/interfaces/contracts/contracts/epochs/IEpochManager.sol +++ b/packages/interfaces/contracts/contracts/epochs/IEpochManager.sol @@ -2,30 +2,77 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Epoch Manager Interface + * @author Edge & Node + * @notice Interface for the Epoch Manager contract that handles protocol epochs + */ interface IEpochManager { // -- Configuration -- + /** + * @notice Set epoch length to `epochLength` blocks + * @param epochLength Epoch length in blocks + */ function setEpochLength(uint256 epochLength) external; // -- Epochs + /** + * @dev Run a new epoch, should be called once at the start of any epoch. + * @notice Perform state changes for the current epoch + */ function runEpoch() external; // -- Getters -- + /** + * @notice Check if the current epoch has been run + * @return True if current epoch has been run, false otherwise + */ function isCurrentEpochRun() external view returns (bool); + /** + * @notice Get the current block number + * @return Current block number + */ function blockNum() external view returns (uint256); + /** + * @notice Get the hash of a specific block + * @param block Block number to get hash for + * @return Block hash + */ function blockHash(uint256 block) external view returns (bytes32); + /** + * @notice Get the current epoch number + * @return Current epoch number + */ function currentEpoch() external view returns (uint256); + /** + * @notice Get the block number when the current epoch started + * @return Block number of current epoch start + */ function currentEpochBlock() external view returns (uint256); + /** + * @notice Get the number of blocks since the current epoch started + * @return Number of blocks since current epoch start + */ function currentEpochBlockSinceStart() external view returns (uint256); + /** + * @notice Get the number of epochs since a given epoch + * @param epoch Epoch to calculate from + * @return Number of epochs since the given epoch + */ function epochsSince(uint256 epoch) external view returns (uint256); + /** + * @notice Get the number of epochs since the last epoch length update + * @return Number of epochs since last update + */ function epochsSinceUpdate() external view returns (uint256); } diff --git a/packages/interfaces/contracts/contracts/gateway/ICallhookReceiver.sol b/packages/interfaces/contracts/contracts/gateway/ICallhookReceiver.sol index 86bc654a0..f96672a49 100644 --- a/packages/interfaces/contracts/contracts/gateway/ICallhookReceiver.sol +++ b/packages/interfaces/contracts/contracts/gateway/ICallhookReceiver.sol @@ -2,12 +2,18 @@ /** * @title Interface for contracts that can receive callhooks through the Arbitrum GRT bridge - * @dev Any contract that can receive a callhook on L2, sent through the bridge from L1, must + * @author Edge & Node + * @notice Any contract that can receive a callhook on L2, sent through the bridge from L1, must * be allowlisted by the governor, but also implement this interface that contains * the function that will actually be called by the L2GraphTokenGateway. */ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Callhook Receiver Interface + * @author Edge & Node + * @notice Interface for contracts that can receive tokens with callhook from the bridge + */ interface ICallhookReceiver { /** * @notice Receive tokens with a callhook from the bridge diff --git a/packages/interfaces/contracts/contracts/governance/IController.sol b/packages/interfaces/contracts/contracts/governance/IController.sol index 2f6d3b6b7..d13eee1b0 100644 --- a/packages/interfaces/contracts/contracts/governance/IController.sol +++ b/packages/interfaces/contracts/contracts/governance/IController.sol @@ -2,28 +2,78 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Controller Interface + * @author Edge & Node + * @notice Interface for the Controller contract that manages protocol governance and contract registry + */ interface IController { + /** + * @notice Return the governor address + * @return The governor address + */ function getGovernor() external view returns (address); // -- Registry -- + /** + * @notice Register contract id and mapped address + * @param id Contract id (keccak256 hash of contract name) + * @param contractAddress Contract address + */ function setContractProxy(bytes32 id, address contractAddress) external; + /** + * @notice Unregister a contract address + * @param id Contract id (keccak256 hash of contract name) + */ function unsetContractProxy(bytes32 id) external; + /** + * @notice Update contract's controller + * @param id Contract id (keccak256 hash of contract name) + * @param controller Controller address + */ function updateController(bytes32 id, address controller) external; + /** + * @notice Get contract proxy address by its id + * @param id Contract id + * @return Address of the proxy contract for the provided id + */ function getContractProxy(bytes32 id) external view returns (address); // -- Pausing -- + /** + * @notice Change the partial paused state of the contract + * Partial pause is intended as a partial pause of the protocol + * @param partialPaused True if the contracts should be (partially) paused, false otherwise + */ function setPartialPaused(bool partialPaused) external; + /** + * @notice Change the paused state of the contract + * Full pause most of protocol functions + * @param paused True if the contracts should be paused, false otherwise + */ function setPaused(bool paused) external; + /** + * @notice Change the Pause Guardian + * @param newPauseGuardian The address of the new Pause Guardian + */ function setPauseGuardian(address newPauseGuardian) external; + /** + * @notice Return whether the protocol is paused + * @return True if the protocol is paused + */ function paused() external view returns (bool); + /** + * @notice Return whether the protocol is partially paused + * @return True if the protocol is partially paused + */ function partialPaused() external view returns (bool); } diff --git a/packages/interfaces/contracts/contracts/governance/IGoverned.sol b/packages/interfaces/contracts/contracts/governance/IGoverned.sol index 200f74ecf..1f8967e40 100644 --- a/packages/interfaces/contracts/contracts/governance/IGoverned.sol +++ b/packages/interfaces/contracts/contracts/governance/IGoverned.sol @@ -3,13 +3,22 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title IGoverned - * @dev Interface for the Governed contract. + * @author Edge & Node + * @notice Interface for governed contracts */ interface IGoverned { // -- State getters -- + /** + * @notice Get the current governor address + * @return The address of the current governor + */ function governor() external view returns (address); + /** + * @notice Get the pending governor address + * @return The address of the pending governor + */ function pendingGovernor() external view returns (address); // -- External functions -- @@ -27,7 +36,17 @@ interface IGoverned { // -- Events -- + /** + * @notice Emitted when a new pending governor is set + * @param from The address of the current governor + * @param to The address of the new pending governor + */ event NewPendingOwnership(address indexed from, address indexed to); + /** + * @notice Emitted when governance is transferred to a new governor + * @param from The address of the previous governor + * @param to The address of the new governor + */ event NewOwnership(address indexed from, address indexed to); } diff --git a/packages/interfaces/contracts/contracts/governance/IManaged.sol b/packages/interfaces/contracts/contracts/governance/IManaged.sol index 9bfe57083..5e862ba1d 100644 --- a/packages/interfaces/contracts/contracts/governance/IManaged.sol +++ b/packages/interfaces/contracts/contracts/governance/IManaged.sol @@ -6,7 +6,8 @@ import { IController } from "./IController.sol"; /** * @title Managed Interface - * @dev Interface for contracts that can be managed by a controller. + * @author Edge & Node + * @notice Interface for contracts that can be managed by a controller. */ interface IManaged { /** diff --git a/packages/interfaces/contracts/contracts/l2/curation/IL2Curation.sol b/packages/interfaces/contracts/contracts/l2/curation/IL2Curation.sol index 18f6882cc..6051d444a 100644 --- a/packages/interfaces/contracts/contracts/l2/curation/IL2Curation.sol +++ b/packages/interfaces/contracts/contracts/l2/curation/IL2Curation.sol @@ -4,6 +4,8 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Interface of the L2 Curation contract. + * @author Edge & Node + * @notice Interface for the L2 Curation contract that handles curation on Layer 2 */ interface IL2Curation { /** diff --git a/packages/interfaces/contracts/contracts/l2/discovery/IL2GNS.sol b/packages/interfaces/contracts/contracts/l2/discovery/IL2GNS.sol index 12a1aeec9..43fd6dffd 100644 --- a/packages/interfaces/contracts/contracts/l2/discovery/IL2GNS.sol +++ b/packages/interfaces/contracts/contracts/l2/discovery/IL2GNS.sol @@ -6,8 +6,15 @@ import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; /** * @title Interface for the L2GNS contract. + * @author Edge & Node + * @notice Interface for the L2 Graph Name System (GNS) contract */ interface IL2GNS is ICallhookReceiver { + /** + * @dev Message codes for L1 to L2 communication + * @param RECEIVE_SUBGRAPH_CODE Code for receiving subgraph transfers + * @param RECEIVE_CURATOR_BALANCE_CODE Code for receiving curator balance transfers + */ enum L1MessageCodes { RECEIVE_SUBGRAPH_CODE, RECEIVE_CURATOR_BALANCE_CODE @@ -16,6 +23,10 @@ interface IL2GNS is ICallhookReceiver { /** * @dev The SubgraphL2TransferData struct holds information * about a subgraph related to its transfer from L1 to L2. + * @param tokens GRT that will be sent to L2 to mint signal + * @param curatorBalanceClaimed True for curators whose balance has been claimed in L2 + * @param l2Done Transfer finished on L2 side + * @param subgraphReceivedOnL2BlockNumber Block number when the subgraph was received on L2 */ struct SubgraphL2TransferData { uint256 tokens; // GRT that will be sent to L2 to mint signal diff --git a/packages/interfaces/contracts/contracts/l2/gateway/IL2GraphTokenGateway.sol b/packages/interfaces/contracts/contracts/l2/gateway/IL2GraphTokenGateway.sol index b1e088212..d43e19a47 100644 --- a/packages/interfaces/contracts/contracts/l2/gateway/IL2GraphTokenGateway.sol +++ b/packages/interfaces/contracts/contracts/l2/gateway/IL2GraphTokenGateway.sol @@ -2,6 +2,14 @@ pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + +/** + * @title IL2GraphTokenGateway + * @author Edge & Node + * @notice Interface for the L2 Graph Token Gateway contract that handles token bridging on L2 + */ interface IL2GraphTokenGateway { // Structs struct OutboundCalldata { @@ -10,7 +18,24 @@ interface IL2GraphTokenGateway { } // Events + /** + * @notice Emitted when a deposit from L1 is finalized on L2 + * @param l1Token The L1 token address + * @param from The sender address on L1 + * @param to The recipient address on L2 + * @param amount The amount of tokens deposited + */ event DepositFinalized(address indexed l1Token, address indexed from, address indexed to, uint256 amount); + + /** + * @notice Emitted when a withdrawal from L2 to L1 is initiated + * @param l1Token The L1 token address + * @param from The sender address on L2 + * @param to The recipient address on L1 + * @param l2ToL1Id The L2 to L1 message ID + * @param exitNum The exit number + * @param amount The amount of tokens withdrawn + */ event WithdrawalInitiated( address l1Token, address indexed from, @@ -19,19 +44,58 @@ interface IL2GraphTokenGateway { uint256 exitNum, uint256 amount ); + + /** + * @notice Emitted when the L2 router address is set + * @param l2Router The new L2 router address + */ event L2RouterSet(address l2Router); + + /** + * @notice Emitted when the L1 token address is set + * @param l1GRT The L1 GRT token address + */ event L1TokenAddressSet(address l1GRT); + + /** + * @notice Emitted when the L1 counterpart address is set + * @param l1Counterpart The L1 counterpart gateway address + */ event L1CounterpartAddressSet(address l1Counterpart); // Functions + /** + * @notice Initialize the gateway contract + * @param controller The controller contract address + */ function initialize(address controller) external; + /** + * @notice Set the L2 router address + * @param l2Router The L2 router contract address + */ function setL2Router(address l2Router) external; + /** + * @notice Set the L1 token address + * @param l1GRT The L1 GRT token contract address + */ function setL1TokenAddress(address l1GRT) external; + /** + * @notice Set the L1 counterpart gateway address + * @param l1Counterpart The L1 counterpart gateway contract address + */ function setL1CounterpartAddress(address l1Counterpart) external; + /** + * @notice Transfer tokens from L2 to L1 + * @param l1Token The L1 token address + * @param to The recipient address on L1 + * @param amount The amount of tokens to transfer + * @param data Additional data for the transfer + * @return The encoded outbound transfer data + */ function outboundTransfer( address l1Token, address to, @@ -39,6 +103,14 @@ interface IL2GraphTokenGateway { bytes calldata data ) external returns (bytes memory); + /** + * @notice Finalize an inbound transfer from L1 to L2 + * @param l1Token The L1 token address + * @param from The sender address on L1 + * @param to The recipient address on L2 + * @param amount The amount of tokens to transfer + * @param data Additional data for the transfer + */ function finalizeInboundTransfer( address l1Token, address from, @@ -47,6 +119,16 @@ interface IL2GraphTokenGateway { bytes calldata data ) external payable; + /** + * @notice Transfer tokens from L2 to L1 (overloaded version with unused parameters) + * @param l1Token The L1 token address + * @param to The recipient address on L1 + * @param amount The amount of tokens to transfer + * @param unused1 Unused parameter for compatibility + * @param unused2 Unused parameter for compatibility + * @param data Additional data for the transfer + * @return The encoded outbound transfer data + */ function outboundTransfer( address l1Token, address to, @@ -56,8 +138,22 @@ interface IL2GraphTokenGateway { bytes calldata data ) external payable returns (bytes memory); + /** + * @notice Calculate the L2 token address for a given L1 token + * @param l1ERC20 The L1 token address + * @return The corresponding L2 token address + */ function calculateL2TokenAddress(address l1ERC20) external view returns (address); + /** + * @notice Get the encoded calldata for an outbound transfer + * @param token The token address + * @param from The sender address + * @param to The recipient address + * @param amount The amount of tokens + * @param data Additional transfer data + * @return The encoded calldata + */ function getOutboundCalldata( address token, address from, diff --git a/packages/interfaces/contracts/contracts/l2/staking/IL2Staking.sol b/packages/interfaces/contracts/contracts/l2/staking/IL2Staking.sol index 0b1718571..4290e5842 100644 --- a/packages/interfaces/contracts/contracts/l2/staking/IL2Staking.sol +++ b/packages/interfaces/contracts/contracts/l2/staking/IL2Staking.sol @@ -9,6 +9,7 @@ import { IL2StakingTypes } from "./IL2StakingTypes.sol"; /** * @title Interface for the L2 Staking contract + * @author Edge & Node * @notice This is the interface that should be used when interacting with the L2 Staking contract. * It extends the IStaking interface with the functions that are specific to L2, adding the callhook receiver * to receive transferred stake and delegation from L1. diff --git a/packages/interfaces/contracts/contracts/l2/staking/IL2StakingBase.sol b/packages/interfaces/contracts/contracts/l2/staking/IL2StakingBase.sol index f5c33c2d0..7f861db39 100644 --- a/packages/interfaces/contracts/contracts/l2/staking/IL2StakingBase.sol +++ b/packages/interfaces/contracts/contracts/l2/staking/IL2StakingBase.sol @@ -2,13 +2,23 @@ pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; /** * @title Base interface for the L2Staking contract. + * @author Edge & Node * @notice This interface is used to define the callhook receiver interface that is implemented by L2Staking. * @dev Note it includes only the L2-specific functionality, not the full IStaking interface. */ interface IL2StakingBase is ICallhookReceiver { + /** + * @notice Emitted when transferred delegation is returned to a delegator + * @param indexer Address of the indexer + * @param delegator Address of the delegator + * @param amount Amount of delegation returned + */ event TransferredDelegationReturnedToDelegator(address indexed indexer, address indexed delegator, uint256 amount); } diff --git a/packages/interfaces/contracts/contracts/l2/staking/IL2StakingTypes.sol b/packages/interfaces/contracts/contracts/l2/staking/IL2StakingTypes.sol index 500694e89..722a2dbf4 100644 --- a/packages/interfaces/contracts/contracts/l2/staking/IL2StakingTypes.sol +++ b/packages/interfaces/contracts/contracts/l2/staking/IL2StakingTypes.sol @@ -2,6 +2,11 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title IL2StakingTypes + * @author Edge & Node + * @notice Interface defining types and enums used by L2 staking contracts + */ interface IL2StakingTypes { /// @dev Message codes for the L1 -> L2 bridge callhook enum L1MessageCodes { diff --git a/packages/interfaces/contracts/contracts/l2/token/IL2GraphToken.sol b/packages/interfaces/contracts/contracts/l2/token/IL2GraphToken.sol index 92b12946d..3bcee6c5f 100644 --- a/packages/interfaces/contracts/contracts/l2/token/IL2GraphToken.sol +++ b/packages/interfaces/contracts/contracts/l2/token/IL2GraphToken.sol @@ -1,20 +1,63 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IGraphToken } from "../../token/IGraphToken.sol"; +/** + * @title IL2GraphToken + * @author Edge & Node + * @notice Interface for the L2 Graph Token contract that extends IGraphToken with L2-specific functionality + */ interface IL2GraphToken is IGraphToken { // Events + /** + * @notice Emitted when tokens are minted through the bridge + * @param account The account that received the minted tokens + * @param amount The amount of tokens minted + */ event BridgeMinted(address indexed account, uint256 amount); + + /** + * @notice Emitted when tokens are burned through the bridge + * @param account The account from which tokens were burned + * @param amount The amount of tokens burned + */ event BridgeBurned(address indexed account, uint256 amount); + + /** + * @notice Emitted when the gateway address is set + * @param gateway The new gateway address + */ event GatewaySet(address gateway); + + /** + * @notice Emitted when the L1 address is set + * @param l1Address The new L1 address + */ event L1AddressSet(address l1Address); // Public state variables (view functions) + /** + * @notice Get the gateway contract address + * @return The address of the gateway contract + */ function gateway() external view returns (address); + + /** + * @notice Get the L1 contract address + * @return The address of the L1 contract + */ function l1Address() external view returns (address); // Functions + + /** + * @notice Initialize the L2 token contract + * @param owner The owner address for the contract + */ function initialize(address owner) external; /** diff --git a/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol b/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol index 7ea628e20..57bb9ef1b 100644 --- a/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol +++ b/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol @@ -2,6 +2,16 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title ILegacyRewardsManager + * @author Edge & Node + * @notice Interface for the legacy rewards manager contract + */ interface ILegacyRewardsManager { + /** + * @notice Get the accumulated rewards for a given allocation + * @param allocationID The allocation identifier + * @return The amount of accumulated rewards + */ function getRewards(address allocationID) external view returns (uint256); } diff --git a/packages/interfaces/contracts/contracts/rewards/IRewardsIssuer.sol b/packages/interfaces/contracts/contracts/rewards/IRewardsIssuer.sol index 0f1ed9d8f..075654619 100644 --- a/packages/interfaces/contracts/contracts/rewards/IRewardsIssuer.sol +++ b/packages/interfaces/contracts/contracts/rewards/IRewardsIssuer.sol @@ -2,9 +2,14 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Rewards Issuer Interface + * @author Edge & Node + * @notice Interface for contracts that issue rewards based on allocation data + */ interface IRewardsIssuer { /** - * @dev Get allocation data to calculate rewards issuance + * @notice Get allocation data to calculate rewards issuance * * @param allocationId The allocation Id * @return isActive Whether the allocation is active or not diff --git a/packages/interfaces/contracts/contracts/rewards/IRewardsManager.sol b/packages/interfaces/contracts/contracts/rewards/IRewardsManager.sol index 32b618f60..72a73e19b 100644 --- a/packages/interfaces/contracts/contracts/rewards/IRewardsManager.sol +++ b/packages/interfaces/contracts/contracts/rewards/IRewardsManager.sol @@ -1,10 +1,19 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6 || 0.8.27; +pragma solidity ^0.7.6 || ^0.8.0; +/** + * @title IRewardsManager + * @author Edge & Node + * @notice Interface for the RewardsManager contract that handles reward distribution + */ interface IRewardsManager { /** - * @dev Stores accumulated rewards and snapshots related to a particular SubgraphDeployment. + * @dev Stores accumulated rewards and snapshots related to a particular SubgraphDeployment + * @param accRewardsForSubgraph Accumulated rewards for the subgraph + * @param accRewardsForSubgraphSnapshot Snapshot of accumulated rewards for the subgraph + * @param accRewardsPerSignalSnapshot Snapshot of accumulated rewards per signal + * @param accRewardsPerAllocatedToken Accumulated rewards per allocated token */ struct Subgraph { uint256 accRewardsForSubgraph; @@ -15,43 +24,128 @@ interface IRewardsManager { // -- Config -- + /** + * @notice Set the issuance per block for rewards distribution + * @param issuancePerBlock The amount of tokens to issue per block + */ function setIssuancePerBlock(uint256 issuancePerBlock) external; + /** + * @notice Sets the minimum signaled tokens on a subgraph to start accruing rewards + * @dev Can be set to zero which means that this feature is not being used + * @param minimumSubgraphSignal Minimum signaled tokens + */ function setMinimumSubgraphSignal(uint256 minimumSubgraphSignal) external; + /** + * @notice Set the subgraph service address + * @param subgraphService Address of the subgraph service contract + */ function setSubgraphService(address subgraphService) external; // -- Denylist -- + /** + * @notice Set the subgraph availability oracle address + * @param subgraphAvailabilityOracle The address of the subgraph availability oracle + */ function setSubgraphAvailabilityOracle(address subgraphAvailabilityOracle) external; + /** + * @notice Set the denied status for a subgraph deployment + * @param subgraphDeploymentID The subgraph deployment ID + * @param deny True to deny, false to allow + */ function setDenied(bytes32 subgraphDeploymentID, bool deny) external; + /** + * @notice Check if a subgraph deployment is denied + * @param subgraphDeploymentID The subgraph deployment ID to check + * @return True if the subgraph is denied, false otherwise + */ function isDenied(bytes32 subgraphDeploymentID) external view returns (bool); // -- Getters -- + /** + * @notice Gets the issuance of rewards per signal since last updated + * @return newly accrued rewards per signal since last update + */ function getNewRewardsPerSignal() external view returns (uint256); + /** + * @notice Gets the currently accumulated rewards per signal + * @return Currently accumulated rewards per signal + */ function getAccRewardsPerSignal() external view returns (uint256); + /** + * @notice Get the accumulated rewards for a specific subgraph + * @param subgraphDeploymentID The subgraph deployment ID + * @return The accumulated rewards for the subgraph + */ function getAccRewardsForSubgraph(bytes32 subgraphDeploymentID) external view returns (uint256); + /** + * @notice Gets the accumulated rewards per allocated token for the subgraph + * @param subgraphDeploymentID Subgraph deployment + * @return Accumulated rewards per allocated token for the subgraph + * @return Accumulated rewards for subgraph + */ function getAccRewardsPerAllocatedToken(bytes32 subgraphDeploymentID) external view returns (uint256, uint256); + /** + * @notice Calculate current rewards for a given allocation on demand + * @param rewardsIssuer The rewards issuer contract + * @param allocationID Allocation + * @return Rewards amount for an allocation + */ function getRewards(address rewardsIssuer, address allocationID) external view returns (uint256); + /** + * @notice Calculate rewards based on tokens and accumulated rewards per allocated token + * @param tokens The number of tokens allocated + * @param accRewardsPerAllocatedToken The accumulated rewards per allocated token + * @return The calculated rewards amount + */ function calcRewards(uint256 tokens, uint256 accRewardsPerAllocatedToken) external pure returns (uint256); // -- Updates -- + /** + * @notice Updates the accumulated rewards per signal and save checkpoint block number + * @dev Must be called before `issuancePerBlock` or `total signalled GRT` changes. + * Called from the Curation contract on mint() and burn() + * @return Accumulated rewards per signal + */ function updateAccRewardsPerSignal() external returns (uint256); + /** + * @notice Pull rewards from the contract for a particular allocation + * @dev This function can only be called by the Staking contract. + * This function will mint the necessary tokens to reward based on the inflation calculation. + * @param allocationID Allocation + * @return Assigned rewards amount + */ function takeRewards(address allocationID) external returns (uint256); // -- Hooks -- + /** + * @notice Triggers an update of rewards for a subgraph + * @dev Must be called before `signalled GRT` on a subgraph changes. + * Hook called from the Curation contract on mint() and burn() + * @param subgraphDeploymentID Subgraph deployment + * @return Accumulated rewards for subgraph + */ function onSubgraphSignalUpdate(bytes32 subgraphDeploymentID) external returns (uint256); + /** + * @notice Triggers an update of rewards for a subgraph + * @dev Must be called before allocation on a subgraph changes. + * Hook called from the Staking contract on allocate() and close() + * @param subgraphDeploymentID Subgraph deployment + * @return Accumulated rewards per allocated token for a subgraph + */ function onSubgraphAllocationUpdate(bytes32 subgraphDeploymentID) external returns (uint256); } diff --git a/packages/interfaces/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol b/packages/interfaces/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol index aca3b0ffd..d59f9f391 100644 --- a/packages/interfaces/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol +++ b/packages/interfaces/contracts/contracts/staking/IL1GraphTokenLockTransferTool.sol @@ -5,7 +5,8 @@ pragma abicoder v2; /** * @title Interface for the L1GraphTokenLockTransferTool contract - * @dev This interface defines the function to get the L2 wallet address for a given L1 token lock wallet. + * @author Edge & Node + * @notice This interface defines the function to get the L2 wallet address for a given L1 token lock wallet. * The Transfer Tool contract is implemented in the token-distribution repo: https://github.com/graphprotocol/token-distribution/pull/64 * and is only included here to provide support in L1Staking for the transfer of stake and delegation * owned by token lock contracts. See GIP-0046 for details: https://forum.thegraph.com/t/4023 diff --git a/packages/interfaces/contracts/contracts/staking/IL1Staking.sol b/packages/interfaces/contracts/contracts/staking/IL1Staking.sol index fd7859220..62dcf9c77 100644 --- a/packages/interfaces/contracts/contracts/staking/IL1Staking.sol +++ b/packages/interfaces/contracts/contracts/staking/IL1Staking.sol @@ -8,6 +8,7 @@ import { IL1StakingBase } from "./IL1StakingBase.sol"; /** * @title Interface for the L1 Staking contract + * @author Edge & Node * @notice This is the interface that should be used when interacting with the L1 Staking contract. * It extends the IStaking interface with the functions that are specific to L1, adding the transfer tools * to send stake and delegation to L2. diff --git a/packages/interfaces/contracts/contracts/staking/IL1StakingBase.sol b/packages/interfaces/contracts/contracts/staking/IL1StakingBase.sol index 9ed037258..a00b6e3cb 100644 --- a/packages/interfaces/contracts/contracts/staking/IL1StakingBase.sol +++ b/packages/interfaces/contracts/contracts/staking/IL1StakingBase.sol @@ -3,23 +3,39 @@ pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IL1GraphTokenLockTransferTool } from "./IL1GraphTokenLockTransferTool.sol"; /** * @title Base interface for the L1Staking contract. + * @author Edge & Node * @notice This interface is used to define the transfer tools that are implemented in L1Staking. * @dev Note it includes only the L1-specific functionality, not the full IStaking interface. */ interface IL1StakingBase { - /// @dev Emitted when an indexer transfers their stake to L2. - /// This can happen several times as indexers can transfer partial stake. + /** + * @notice Emitted when an indexer transfers their stake to L2. + * This can happen several times as indexers can transfer partial stake. + * @param indexer Address of the indexer on L1 + * @param l2Indexer Address of the indexer on L2 + * @param transferredStakeTokens Amount of stake tokens transferred + */ event IndexerStakeTransferredToL2( address indexed indexer, address indexed l2Indexer, uint256 transferredStakeTokens ); - /// @dev Emitted when a delegator transfers their delegation to L2 + /** + * @notice Emitted when a delegator transfers their delegation to L2 + * @param delegator Address of the delegator on L1 + * @param l2Delegator Address of the delegator on L2 + * @param indexer Address of the indexer on L1 + * @param l2Indexer Address of the indexer on L2 + * @param transferredDelegationTokens Amount of delegation tokens transferred + */ event DelegationTransferredToL2( address indexed delegator, address indexed l2Delegator, @@ -28,10 +44,17 @@ interface IL1StakingBase { uint256 transferredDelegationTokens ); - /// @dev Emitted when the L1GraphTokenLockTransferTool is set + /** + * @notice Emitted when the L1GraphTokenLockTransferTool is set + * @param l1GraphTokenLockTransferTool Address of the L1GraphTokenLockTransferTool contract + */ event L1GraphTokenLockTransferToolSet(address l1GraphTokenLockTransferTool); - /// @dev Emitted when a delegator unlocks their tokens ahead of time because the indexer has transferred to L2 + /** + * @notice Emitted when a delegator unlocks their tokens ahead of time because the indexer has transferred to L2 + * @param indexer Address of the indexer that transferred to L2 + * @param delegator Address of the delegator unlocking their tokens + */ event StakeDelegatedUnlockedDueToL2Transfer(address indexed indexer, address indexed delegator); /** diff --git a/packages/interfaces/contracts/contracts/staking/IStaking.sol b/packages/interfaces/contracts/contracts/staking/IStaking.sol index c18e382b3..9b9a6fc5c 100644 --- a/packages/interfaces/contracts/contracts/staking/IStaking.sol +++ b/packages/interfaces/contracts/contracts/staking/IStaking.sol @@ -10,6 +10,7 @@ import { IManaged } from "../governance/IManaged.sol"; /** * @title Interface for the Staking contract + * @author Edge & Node * @notice This is the interface that should be used when interacting with the Staking contract. * @dev Note that Staking doesn't actually inherit this interface. This is because of * the custom setup of the Staking contract where part of the functionality is implemented diff --git a/packages/interfaces/contracts/contracts/staking/IStakingBase.sol b/packages/interfaces/contracts/contracts/staking/IStakingBase.sol index d7728d049..25d643c6f 100644 --- a/packages/interfaces/contracts/contracts/staking/IStakingBase.sol +++ b/packages/interfaces/contracts/contracts/staking/IStakingBase.sol @@ -3,10 +3,15 @@ pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IStakingData } from "./IStakingData.sol"; /** * @title Base interface for the Staking contract. + * @author Edge & Node + * @notice Base interface for the Staking contract. * @dev This interface includes only what's implemented in the base Staking contract. * It does not include the L1 and L2 specific functionality. It also does not include * several functions that are implemented in the StakingExtension contract, and are called @@ -15,25 +20,38 @@ import { IStakingData } from "./IStakingData.sol"; */ interface IStakingBase is IStakingData { /** - * @dev Emitted when `indexer` stakes `tokens` amount. + * @notice Emitted when `indexer` stakes `tokens` amount. + * @param indexer Address of the indexer + * @param tokens Amount of tokens staked */ event StakeDeposited(address indexed indexer, uint256 tokens); /** - * @dev Emitted when `indexer` unstaked and locked `tokens` amount until `until` block. + * @notice Emitted when `indexer` unstaked and locked `tokens` amount until `until` block. + * @param indexer Address of the indexer + * @param tokens Amount of tokens locked + * @param until Block number until which tokens are locked */ event StakeLocked(address indexed indexer, uint256 tokens, uint256 until); /** - * @dev Emitted when `indexer` withdrew `tokens` staked. + * @notice Emitted when `indexer` withdrew `tokens` staked. + * @param indexer Address of the indexer + * @param tokens Amount of tokens withdrawn */ event StakeWithdrawn(address indexed indexer, uint256 tokens); /** - * @dev Emitted when `indexer` allocated `tokens` amount to `subgraphDeploymentID` + * @notice Emitted when `indexer` allocated `tokens` amount to `subgraphDeploymentID` * during `epoch`. * `allocationID` indexer derived address used to identify the allocation. * `metadata` additional information related to the allocation. + * @param indexer Address of the indexer + * @param subgraphDeploymentID Subgraph deployment ID + * @param epoch Epoch when allocation was created + * @param tokens Amount of tokens allocated + * @param allocationID Allocation identifier + * @param metadata IPFS hash for additional allocation information */ event AllocationCreated( address indexed indexer, @@ -45,10 +63,18 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` close an allocation in `epoch` for `allocationID`. + * @notice Emitted when `indexer` close an allocation in `epoch` for `allocationID`. * An amount of `tokens` get unallocated from `subgraphDeploymentID`. * This event also emits the POI (proof of indexing) submitted by the indexer. * `isPublic` is true if the sender was someone other than the indexer. + * @param indexer Address of the indexer + * @param subgraphDeploymentID Subgraph deployment ID + * @param epoch Epoch when allocation was closed + * @param tokens Amount of tokens unallocated + * @param allocationID Allocation identifier + * @param sender Address that closed the allocation + * @param poi Proof of indexing submitted + * @param isPublic True if closed by someone other than the indexer */ event AllocationClosed( address indexed indexer, @@ -62,12 +88,23 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`. + * @notice Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`. * `epoch` is the protocol epoch the rebate was collected on * The rebate is for `tokens` amount which are being provided by `assetHolder`; `queryFees` * is the amount up for rebate after `curationFees` are distributed and `protocolTax` is burnt. * `queryRebates` is the amount distributed to the `indexer` with `delegationFees` collected * and sent to the delegation pool. + * @param assetHolder Address providing the rebate tokens + * @param indexer Address of the indexer collecting the rebate + * @param subgraphDeploymentID Subgraph deployment ID + * @param allocationID Allocation identifier + * @param epoch Epoch when rebate was collected + * @param tokens Total amount of tokens in the rebate + * @param protocolTax Amount burned as protocol tax + * @param curationFees Amount distributed to curators + * @param queryFees Amount available for rebate after fees + * @param queryRebates Amount distributed to the indexer + * @param delegationRewards Amount distributed to delegators */ event RebateCollected( address assetHolder, @@ -84,7 +121,11 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` update the delegation parameters for its delegation pool. + * @notice Emitted when `indexer` update the delegation parameters for its delegation pool. + * @param indexer Address of the indexer + * @param indexingRewardCut Percentage of indexing rewards left for the indexer + * @param queryFeeCut Percentage of query fees left for the indexer + * @param __DEPRECATED_cooldownBlocks Deprecated parameter (no longer used) */ event DelegationParametersUpdated( address indexed indexer, @@ -94,18 +135,24 @@ interface IStakingBase is IStakingData { ); /** - * @dev Emitted when `indexer` set `operator` access. + * @notice Emitted when `indexer` set `operator` access. + * @param indexer Address of the indexer + * @param operator Address of the operator + * @param allowed Whether the operator is authorized */ event SetOperator(address indexed indexer, address indexed operator, bool allowed); /** - * @dev Emitted when `indexer` set an address to receive rewards. + * @notice Emitted when `indexer` set an address to receive rewards. + * @param indexer Address of the indexer + * @param destination Address to receive rewards */ event SetRewardsDestination(address indexed indexer, address indexed destination); /** - * @dev Emitted when `extensionImpl` was set as the address of the StakingExtension contract + * @notice Emitted when `extensionImpl` was set as the address of the StakingExtension contract * to which extended functionality is delegated. + * @param extensionImpl Address of the StakingExtension implementation */ event ExtensionImplementationSet(address indexed extensionImpl); @@ -260,12 +307,9 @@ interface IStakingBase is IStakingData { * @notice Set the delegation parameters for the caller. * @param indexingRewardCut Percentage of indexing rewards left for the indexer * @param queryFeeCut Percentage of query fees left for the indexer + * @param cooldownBlocks Deprecated cooldown blocks parameter (no longer used) */ - function setDelegationParameters( - uint32 indexingRewardCut, - uint32 queryFeeCut, - uint32 // cooldownBlocks, deprecated - ) external; + function setDelegationParameters(uint32 indexingRewardCut, uint32 queryFeeCut, uint32 cooldownBlocks) external; /** * @notice Allocate available tokens to a subgraph deployment. @@ -362,18 +406,27 @@ interface IStakingBase is IStakingData { function getAllocation(address allocationID) external view returns (Allocation memory); /** - * @dev New function to get the allocation data for the rewards manager + * @notice Get the allocation data for the rewards manager * @dev Note that this is only to make tests pass, as the staking contract with * this changes will never get deployed. HorizonStaking is taking it's place. + * @param allocationID The allocation ID + * @return active Whether the allocation is active + * @return indexer The indexer address + * @return subgraphDeploymentID The subgraph deployment ID + * @return tokens The allocated tokens + * @return createdAtEpoch The epoch when allocation was created + * @return closedAtEpoch The epoch when allocation was closed */ function getAllocationData( address allocationID ) external view returns (bool, address, bytes32, uint256, uint256, uint256); /** - * @dev New function to get the allocation active status for the rewards manager + * @notice Get the allocation active status for the rewards manager * @dev Note that this is only to make tests pass, as the staking contract with * this changes will never get deployed. HorizonStaking is taking it's place. + * @param allocationID The allocation ID + * @return Whether the allocation is active */ function isActiveAllocation(address allocationID) external view returns (bool); diff --git a/packages/interfaces/contracts/contracts/staking/IStakingData.sol b/packages/interfaces/contracts/contracts/staking/IStakingData.sol index 7db4d0ca1..b24c6cb39 100644 --- a/packages/interfaces/contracts/contracts/staking/IStakingData.sol +++ b/packages/interfaces/contracts/contracts/staking/IStakingData.sol @@ -4,12 +4,22 @@ pragma solidity ^0.7.6 || 0.8.27; /** * @title Staking Data interface - * @dev This interface defines some structures used by the Staking contract. + * @author Edge & Node + * @notice This interface defines some structures used by the Staking contract. */ interface IStakingData { /** * @dev Allocate GRT tokens for the purpose of serving queries of a subgraph deployment * An allocation is created in the allocate() function and closed in closeAllocation() + * @param indexer Address of the indexer that owns the allocation + * @param subgraphDeploymentID Subgraph deployment ID being allocated to + * @param tokens Tokens allocated to a SubgraphDeployment + * @param createdAtEpoch Epoch when it was created + * @param closedAtEpoch Epoch when it was closed + * @param collectedFees Collected fees for the allocation + * @param __DEPRECATED_effectiveAllocation Deprecated field for effective allocation + * @param accRewardsPerAllocatedToken Snapshot used for reward calc + * @param distributedRebates Collected rebates that have been rebated */ struct Allocation { address indexer; @@ -27,6 +37,13 @@ interface IStakingData { /** * @dev Delegation pool information. One per indexer. + * @param __DEPRECATED_cooldownBlocks Deprecated field for cooldown blocks + * @param indexingRewardCut Indexing reward cut in PPM + * @param queryFeeCut Query fee cut in PPM + * @param updatedAtBlock Block when the pool was last updated + * @param tokens Total tokens as pool reserves + * @param shares Total shares minted in the pool + * @param delegators Mapping of delegator => Delegation */ struct DelegationPool { uint32 __DEPRECATED_cooldownBlocks; // solhint-disable-line var-name-mixedcase @@ -40,6 +57,9 @@ interface IStakingData { /** * @dev Individual delegation data of a delegator in a pool. + * @param shares Shares owned by a delegator in the pool + * @param tokensLocked Tokens locked for undelegation + * @param tokensLockedUntil Epoch when locked tokens can be withdrawn */ struct Delegation { uint256 shares; // Shares owned by a delegator in the pool @@ -49,6 +69,10 @@ interface IStakingData { /** * @dev Rebates parameters. Used to avoid stack too deep errors in Staking initialize function. + * @param alphaNumerator Alpha parameter numerator for rebate calculation + * @param alphaDenominator Alpha parameter denominator for rebate calculation + * @param lambdaNumerator Lambda parameter numerator for rebate calculation + * @param lambdaDenominator Lambda parameter denominator for rebate calculation */ struct RebatesParameters { uint32 alphaNumerator; diff --git a/packages/interfaces/contracts/contracts/staking/IStakingExtension.sol b/packages/interfaces/contracts/contracts/staking/IStakingExtension.sol index 0a13ab744..396a030a6 100644 --- a/packages/interfaces/contracts/contracts/staking/IStakingExtension.sol +++ b/packages/interfaces/contracts/contracts/staking/IStakingExtension.sol @@ -3,12 +3,16 @@ pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IStakingData } from "./IStakingData.sol"; import { IStakes } from "./libs/IStakes.sol"; /** * @title Interface for the StakingExtension contract - * @dev This interface defines the events and functions implemented + * @author Edge & Node + * @notice This interface defines the events and functions implemented * in the StakingExtension contract, which is used to extend the functionality * of the Staking contract while keeping it within the 24kB mainnet size limit. * In particular, this interface includes delegation functions and various storage @@ -18,6 +22,12 @@ interface IStakingExtension is IStakingData { /** * @dev DelegationPool struct as returned by delegationPools(), since * the original DelegationPool in IStakingData.sol contains a nested mapping. + * @param __DEPRECATED_cooldownBlocks Deprecated field for cooldown blocks + * @param indexingRewardCut Indexing reward cut in PPM + * @param queryFeeCut Query fee cut in PPM + * @param updatedAtBlock Block when the pool was last updated + * @param tokens Total tokens as pool reserves + * @param shares Total shares minted in the pool */ struct DelegationPoolReturn { uint32 __DEPRECATED_cooldownBlocks; // solhint-disable-line var-name-mixedcase @@ -29,14 +39,23 @@ interface IStakingExtension is IStakingData { } /** - * @dev Emitted when `delegator` delegated `tokens` to the `indexer`, the delegator + * @notice Emitted when `delegator` delegated `tokens` to the `indexer`, the delegator * gets `shares` for the delegation pool proportionally to the tokens staked. + * @param indexer Address of the indexer receiving the delegation + * @param delegator Address of the delegator + * @param tokens Amount of tokens delegated + * @param shares Amount of shares issued to the delegator */ event StakeDelegated(address indexed indexer, address indexed delegator, uint256 tokens, uint256 shares); /** - * @dev Emitted when `delegator` undelegated `tokens` from `indexer`. + * @notice Emitted when `delegator` undelegated `tokens` from `indexer`. * Tokens get locked for withdrawal after a period of time. + * @param indexer Address of the indexer from which tokens are undelegated + * @param delegator Address of the delegator + * @param tokens Amount of tokens undelegated + * @param shares Amount of shares returned + * @param until Epoch until which tokens are locked */ event StakeDelegatedLocked( address indexed indexer, @@ -47,18 +66,28 @@ interface IStakingExtension is IStakingData { ); /** - * @dev Emitted when `delegator` withdrew delegated `tokens` from `indexer`. + * @notice Emitted when `delegator` withdrew delegated `tokens` from `indexer`. + * @param indexer Address of the indexer from which tokens are withdrawn + * @param delegator Address of the delegator + * @param tokens Amount of tokens withdrawn */ event StakeDelegatedWithdrawn(address indexed indexer, address indexed delegator, uint256 tokens); /** - * @dev Emitted when `indexer` was slashed for a total of `tokens` amount. + * @notice Emitted when `indexer` was slashed for a total of `tokens` amount. * Tracks `reward` amount of tokens given to `beneficiary`. + * @param indexer Address of the indexer that was slashed + * @param tokens Total amount of tokens slashed + * @param reward Amount of tokens given as reward + * @param beneficiary Address receiving the reward */ event StakeSlashed(address indexed indexer, uint256 tokens, uint256 reward, address beneficiary); /** - * @dev Emitted when `caller` set `slasher` address as `allowed` to slash stakes. + * @notice Emitted when `caller` set `slasher` address as `allowed` to slash stakes. + * @param caller Address that updated the slasher status + * @param slasher Address of the slasher + * @param allowed Whether the slasher is allowed to slash */ event SlasherUpdate(address indexed caller, address indexed slasher, bool allowed); @@ -114,6 +143,7 @@ interface IStakingExtension is IStakingData { * re-delegate to a new indexer. * @param indexer Withdraw available tokens delegated to indexer * @param newIndexer Re-delegate to indexer address if non-zero, withdraw if zero address + * @return Amount of tokens withdrawn */ function withdrawDelegated(address indexer, address newIndexer) external returns (uint256); diff --git a/packages/interfaces/contracts/contracts/staking/libs/IStakes.sol b/packages/interfaces/contracts/contracts/staking/libs/IStakes.sol index 701336409..10364ebad 100644 --- a/packages/interfaces/contracts/contracts/staking/libs/IStakes.sol +++ b/packages/interfaces/contracts/contracts/staking/libs/IStakes.sol @@ -3,6 +3,11 @@ pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; +/** + * @title Interface for staking data structures + * @author Edge & Node + * @notice Defines the data structures used for indexer staking + */ interface IStakes { struct Indexer { uint256 tokensStaked; // Tokens on the indexer stake (staked by the indexer) diff --git a/packages/interfaces/contracts/contracts/token/IGraphToken.sol b/packages/interfaces/contracts/contracts/token/IGraphToken.sol index 8d5d1b845..12cd2b2be 100644 --- a/packages/interfaces/contracts/contracts/token/IGraphToken.sol +++ b/packages/interfaces/contracts/contracts/token/IGraphToken.sol @@ -2,25 +2,67 @@ pragma solidity ^0.7.6 || 0.8.27; +// Solhint linting fails for 0.8.0. +// solhint-disable-next-line import-path-check import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +/** + * @title IGraphToken + * @author Edge & Node + * @notice Interface for the Graph Token contract + * @dev Extends IERC20 with additional functionality for minting, burning, and permit + */ interface IGraphToken is IERC20 { // -- Mint and Burn -- + /** + * @notice Burns tokens from the caller's account + * @param amount The amount of tokens to burn + */ function burn(uint256 amount) external; + /** + * @notice Burns tokens from a specified account (requires allowance) + * @param from The account to burn tokens from + * @param amount The amount of tokens to burn + */ function burnFrom(address from, uint256 amount) external; + /** + * @notice Mints new tokens to a specified account + * @dev Only callable by accounts with minter role + * @param to The account to mint tokens to + * @param amount The amount of tokens to mint + */ function mint(address to, uint256 amount) external; // -- Mint Admin -- + /** + * @notice Adds a new minter account + * @dev Only callable by accounts with appropriate permissions + * @param account The account to grant minter role to + */ function addMinter(address account) external; + /** + * @notice Removes minter role from an account + * @dev Only callable by accounts with appropriate permissions + * @param account The account to revoke minter role from + */ function removeMinter(address account) external; + /** + * @notice Renounces minter role for the caller + * @dev Allows a minter to voluntarily give up their minting privileges + */ function renounceMinter() external; + /** + * @notice Checks if an account has minter role + * @param account The account to check + * @return True if the account is a minter, false otherwise + */ function isMinter(address account) external view returns (bool); // -- Permit -- @@ -47,7 +89,19 @@ interface IGraphToken is IERC20 { // -- Allowance -- + /** + * @notice Increases the allowance granted to a spender + * @param spender The account whose allowance will be increased + * @param addedValue The amount to increase the allowance by + * @return True if the operation succeeded + */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool); + /** + * @notice Decreases the allowance granted to a spender + * @param spender The account whose allowance will be decreased + * @param subtractedValue The amount to decrease the allowance by + * @return True if the operation succeeded + */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); } diff --git a/packages/interfaces/contracts/contracts/upgrades/IGraphProxy.sol b/packages/interfaces/contracts/contracts/upgrades/IGraphProxy.sol index 108708c03..eb0210d72 100644 --- a/packages/interfaces/contracts/contracts/upgrades/IGraphProxy.sol +++ b/packages/interfaces/contracts/contracts/upgrades/IGraphProxy.sol @@ -2,18 +2,76 @@ pragma solidity ^0.7.6 || 0.8.27; +/** + * @title Graph Proxy Interface + * @author Edge & Node + * @notice Interface for the Graph Proxy contract that handles upgradeable proxy functionality + */ interface IGraphProxy { + /** + * @notice Get the current admin. + * + * @dev NOTE: Only the admin can call this function. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` + * + * @return adminAddress The address of the current admin + */ function admin() external returns (address); + /** + * @notice Change the admin of the proxy. + * + * @dev NOTE: Only the admin can call this function. + * + * @param newAdmin Address of the new admin + */ function setAdmin(address newAdmin) external; + /** + * @notice Get the current implementation. + * + * @dev NOTE: Only the admin can call this function. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` + * + * @return implementationAddress The address of the current implementation for this proxy + */ function implementation() external returns (address); + /** + * @notice Get the current pending implementation. + * + * @dev NOTE: Only the admin can call this function. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c` + * + * @return pendingImplementationAddress The address of the current pending implementation for this proxy + */ function pendingImplementation() external returns (address); + /** + * @notice Upgrades to a new implementation contract. + * @dev NOTE: Only the admin can call this function. + * @param newImplementation Address of implementation contract + */ function upgradeTo(address newImplementation) external; + /** + * @notice Admin function for new implementation to accept its role as implementation. + */ function acceptUpgrade() external; + /** + * @notice Admin function for new implementation to accept its role as implementation, + * calling a function on the new implementation. + * @param data Calldata (including selector) for the function to delegatecall into the implementation + */ function acceptUpgradeAndCall(bytes calldata data) external; } diff --git a/packages/interfaces/contracts/contracts/upgrades/IGraphProxyAdmin.sol b/packages/interfaces/contracts/contracts/upgrades/IGraphProxyAdmin.sol index 44e0df0e4..a7139f554 100644 --- a/packages/interfaces/contracts/contracts/upgrades/IGraphProxyAdmin.sol +++ b/packages/interfaces/contracts/contracts/upgrades/IGraphProxyAdmin.sol @@ -7,30 +7,81 @@ import { IGoverned } from "../governance/IGoverned.sol"; /** * @title IGraphProxyAdmin - * @dev GraphProxyAdmin contract interface + * @author Edge & Node + * @notice GraphProxyAdmin contract interface for managing proxy contracts * @dev Note that this interface is not used by the contract implementation, just used for types and abi generation * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ interface IGraphProxyAdmin is IGoverned { + /** + * @notice Get the implementation address of a proxy + * @param proxy The proxy contract to query + * @return The implementation address + */ function getProxyImplementation(IGraphProxy proxy) external view returns (address); + /** + * @notice Get the pending implementation address of a proxy + * @param proxy The proxy contract to query + * @return The pending implementation address + */ function getProxyPendingImplementation(IGraphProxy proxy) external view returns (address); + /** + * @notice Get the admin address of a proxy + * @param proxy The proxy contract to query + * @return The admin address + */ function getProxyAdmin(IGraphProxy proxy) external view returns (address); + /** + * @notice Change the admin of a proxy contract + * @param proxy The proxy contract to modify + * @param newAdmin The new admin address + */ function changeProxyAdmin(IGraphProxy proxy, address newAdmin) external; + /** + * @notice Upgrade a proxy to a new implementation + * @param proxy The proxy contract to upgrade + * @param implementation The new implementation address + */ function upgrade(IGraphProxy proxy, address implementation) external; + /** + * @notice Upgrade a proxy to a new implementation + * @param proxy The proxy contract to upgrade + * @param implementation The new implementation address + */ function upgradeTo(IGraphProxy proxy, address implementation) external; + /** + * @notice Upgrade a proxy to a new implementation and call a function + * @param proxy The proxy contract to upgrade + * @param implementation The new implementation address + * @param data The calldata to execute on the new implementation + */ function upgradeToAndCall(IGraphProxy proxy, address implementation, bytes calldata data) external; + /** + * @notice Accept ownership of a proxy contract + * @param proxy The proxy contract to accept + */ function acceptProxy(IGraphProxy proxy) external; + /** + * @notice Accept ownership of a proxy contract and call a function + * @param proxy The proxy contract to accept + * @param data The calldata to execute after accepting + */ function acceptProxyAndCall(IGraphProxy proxy, bytes calldata data) external; // storage + + /** + * @notice Get the governor address + * @return The address of the governor + */ function governor() external view returns (address); } diff --git a/packages/interfaces/contracts/data-service/IDataService.sol b/packages/interfaces/contracts/data-service/IDataService.sol index 778987f71..564ba1a89 100644 --- a/packages/interfaces/contracts/data-service/IDataService.sol +++ b/packages/interfaces/contracts/data-service/IDataService.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IGraphPayments } from "../horizon/IGraphPayments.sol"; /** * @title Interface of the base {DataService} contract as defined by the Graph Horizon specification. + * @author Edge & Node * @notice This interface provides a guardrail for contracts that use the Data Service framework * to implement a data service on Graph Horizon. Much of the specification is intentionally loose * to allow for greater flexibility when designing a data service. It's not possible to guarantee that diff --git a/packages/interfaces/contracts/data-service/IDataServiceFees.sol b/packages/interfaces/contracts/data-service/IDataServiceFees.sol index 9d235f4f7..fad127aba 100644 --- a/packages/interfaces/contracts/data-service/IDataServiceFees.sol +++ b/packages/interfaces/contracts/data-service/IDataServiceFees.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IDataService } from "./IDataService.sol"; /** * @title Interface for the {DataServiceFees} contract. + * @author Edge & Node * @notice Extension for the {IDataService} contract to handle payment collateralization * using a Horizon provision. * diff --git a/packages/interfaces/contracts/data-service/IDataServicePausable.sol b/packages/interfaces/contracts/data-service/IDataServicePausable.sol index 906e864a8..ad355d9f0 100644 --- a/packages/interfaces/contracts/data-service/IDataServicePausable.sol +++ b/packages/interfaces/contracts/data-service/IDataServicePausable.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IDataService } from "./IDataService.sol"; /** * @title Interface for the {DataServicePausable} contract. + * @author Edge & Node * @notice Extension for the {IDataService} contract, adds pausing functionality * to the data service. Pausing is controlled by privileged accounts called * pause guardians. diff --git a/packages/interfaces/contracts/data-service/IDataServiceRescuable.sol b/packages/interfaces/contracts/data-service/IDataServiceRescuable.sol index f2cd7b06e..478e429da 100644 --- a/packages/interfaces/contracts/data-service/IDataServiceRescuable.sol +++ b/packages/interfaces/contracts/data-service/IDataServiceRescuable.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IDataService } from "./IDataService.sol"; /** * @title Interface for the {IDataServicePausable} contract. + * @author Edge & Node * @notice Extension for the {IDataService} contract, adds the ability to rescue * any ERC20 token or ETH from the contract, controlled by a rescuer privileged role. * @custom:security-contact Please email security+contracts@thegraph.com if you find any diff --git a/packages/interfaces/contracts/horizon/IAuthorizable.sol b/packages/interfaces/contracts/horizon/IAuthorizable.sol index 7a7a77798..5b32a69ff 100644 --- a/packages/interfaces/contracts/horizon/IAuthorizable.sol +++ b/packages/interfaces/contracts/horizon/IAuthorizable.sol @@ -1,8 +1,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events +// solhint-disable gas-struct-packing + /** * @title Interface for the {Authorizable} contract + * @author Edge & Node * @notice Implements an authorization scheme that allows authorizers to * authorize signers to sign on their behalf. * @custom:security-contact Please email security+contracts@thegraph.com if you find any diff --git a/packages/interfaces/contracts/horizon/IGraphPayments.sol b/packages/interfaces/contracts/horizon/IGraphPayments.sol index 7a583f883..7c3485c62 100644 --- a/packages/interfaces/contracts/horizon/IGraphPayments.sol +++ b/packages/interfaces/contracts/horizon/IGraphPayments.sol @@ -1,8 +1,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + /** * @title Interface for the {GraphPayments} contract + * @author Edge & Node * @notice This contract is part of the Graph Horizon payments protocol. It's designed * to pull funds (GRT) from the {PaymentsEscrow} and distribute them according to a * set of pre established rules. diff --git a/packages/interfaces/contracts/horizon/IGraphTallyCollector.sol b/packages/interfaces/contracts/horizon/IGraphTallyCollector.sol index 86d0ebc3a..1f77cb693 100644 --- a/packages/interfaces/contracts/horizon/IGraphTallyCollector.sol +++ b/packages/interfaces/contracts/horizon/IGraphTallyCollector.sol @@ -7,6 +7,7 @@ import { IAuthorizable } from "./IAuthorizable.sol"; /** * @title Interface for the {GraphTallyCollector} contract + * @author Edge & Node * @dev Implements the {IPaymentCollector} interface as defined by the Graph * Horizon payments protocol. * @notice Implements a payments collector contract that can be used to collect @@ -49,8 +50,8 @@ interface IGraphTallyCollector is IPaymentsCollector, IAuthorizable { * @notice Emitted when a RAV is collected * @param collectionId The ID of the collection "bucket" the RAV belongs to. * @param payer The address of the payer - * @param dataService The address of the data service * @param serviceProvider The address of the service provider + * @param dataService The address of the data service * @param timestampNs The timestamp of the RAV * @param valueAggregate The total amount owed to the service provider * @param metadata Arbitrary metadata @@ -122,14 +123,14 @@ interface IGraphTallyCollector is IPaymentsCollector, IAuthorizable { ) external returns (uint256); /** - * @dev Recovers the signer address of a signed ReceiptAggregateVoucher (RAV). + * @notice Recovers the signer address of a signed ReceiptAggregateVoucher (RAV). * @param signedRAV The SignedRAV containing the RAV and its signature. * @return The address of the signer. */ function recoverRAVSigner(SignedRAV calldata signedRAV) external view returns (address); /** - * @dev Computes the hash of a ReceiptAggregateVoucher (RAV). + * @notice Computes the hash of a ReceiptAggregateVoucher (RAV). * @param rav The RAV for which to compute the hash. * @return The hash of the RAV. */ diff --git a/packages/interfaces/contracts/horizon/IHorizonStaking.sol b/packages/interfaces/contracts/horizon/IHorizonStaking.sol index 0ba4e26b3..ac98a5a7d 100644 --- a/packages/interfaces/contracts/horizon/IHorizonStaking.sol +++ b/packages/interfaces/contracts/horizon/IHorizonStaking.sol @@ -9,6 +9,7 @@ import { IHorizonStakingExtension } from "./internal/IHorizonStakingExtension.so /** * @title Complete interface for the Horizon Staking contract + * @author Edge & Node * @notice This interface exposes all functions implemented by the {HorizonStaking} contract and its extension * {HorizonStakingExtension} as well as the custom data types used by the contract. * @dev Use this interface to interact with the Horizon Staking contract. diff --git a/packages/interfaces/contracts/horizon/IPaymentsCollector.sol b/packages/interfaces/contracts/horizon/IPaymentsCollector.sol index d37688462..1a3b6c8b8 100644 --- a/packages/interfaces/contracts/horizon/IPaymentsCollector.sol +++ b/packages/interfaces/contracts/horizon/IPaymentsCollector.sol @@ -6,6 +6,7 @@ import { IGraphPayments } from "./IGraphPayments.sol"; /** * @title Interface for a payments collector contract as defined by Graph Horizon payments protocol + * @author Edge & Node * @notice Contracts implementing this interface can be used with the payments protocol. First, a payer must * approve the collector to collect payments on their behalf. Only then can payment collection be initiated * using the collector contract. diff --git a/packages/interfaces/contracts/horizon/IPaymentsEscrow.sol b/packages/interfaces/contracts/horizon/IPaymentsEscrow.sol index 601783b12..7c1243b55 100644 --- a/packages/interfaces/contracts/horizon/IPaymentsEscrow.sol +++ b/packages/interfaces/contracts/horizon/IPaymentsEscrow.sol @@ -5,6 +5,7 @@ import { IGraphPayments } from "./IGraphPayments.sol"; /** * @title Interface for the {PaymentsEscrow} contract + * @author Edge & Node * @notice This contract is part of the Graph Horizon payments protocol. It holds the funds (GRT) * for payments made through the payments protocol for services provided * via a Graph Horizon data service. diff --git a/packages/interfaces/contracts/horizon/internal/IHorizonStakingBase.sol b/packages/interfaces/contracts/horizon/internal/IHorizonStakingBase.sol index ba050ae3a..f5f32232b 100644 --- a/packages/interfaces/contracts/horizon/internal/IHorizonStakingBase.sol +++ b/packages/interfaces/contracts/horizon/internal/IHorizonStakingBase.sol @@ -2,6 +2,9 @@ pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IHorizonStakingTypes } from "./IHorizonStakingTypes.sol"; import { IGraphPayments } from "../IGraphPayments.sol"; @@ -9,6 +12,7 @@ import { ILinkedList } from "./ILinkedList.sol"; /** * @title Interface for the {HorizonStakingBase} contract. + * @author Edge & Node * @notice Provides getters for {HorizonStaking} and {HorizonStakingExtension} storage variables. * @dev Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision * functions take `serviceProvider` and `verifier` addresses. diff --git a/packages/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol b/packages/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol index d590a76a5..eb5e811c6 100644 --- a/packages/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol +++ b/packages/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol @@ -2,10 +2,14 @@ pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IRewardsIssuer } from "../../contracts/rewards/IRewardsIssuer.sol"; /** * @title Interface for {HorizonStakingExtension} contract. + * @author Edge & Node * @notice Provides functions for managing legacy allocations. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. @@ -50,7 +54,7 @@ interface IHorizonStakingExtension is IRewardsIssuer { } /** - * @dev Emitted when `indexer` close an allocation in `epoch` for `allocationID`. + * @notice Emitted when `indexer` close an allocation in `epoch` for `allocationID`. * An amount of `tokens` get unallocated from `subgraphDeploymentID`. * This event also emits the POI (proof of indexing) submitted by the indexer. * `isPublic` is true if the sender was someone other than the indexer. @@ -75,7 +79,7 @@ interface IHorizonStakingExtension is IRewardsIssuer { ); /** - * @dev Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`. + * @notice Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`. * `epoch` is the protocol epoch the rebate was collected on * The rebate is for `tokens` amount which are being provided by `assetHolder`; `queryFees` * is the amount up for rebate after `curationFees` are distributed and `protocolTax` is burnt. @@ -108,7 +112,7 @@ interface IHorizonStakingExtension is IRewardsIssuer { ); /** - * @dev Emitted when `indexer` was slashed for a total of `tokens` amount. + * @notice Emitted when `indexer` was slashed for a total of `tokens` amount. * Tracks `reward` amount of tokens given to `beneficiary`. * @param indexer The indexer address * @param tokens The amount of tokens slashed @@ -128,7 +132,7 @@ interface IHorizonStakingExtension is IRewardsIssuer { function closeAllocation(address allocationID, bytes32 poi) external; /** - * @dev Collect and rebate query fees to the indexer + * @notice Collect and rebate query fees to the indexer * This function will accept calls with zero tokens. * We use an exponential rebate formula to calculate the amount of tokens to rebate to the indexer. * This implementation allows collecting multiple times on the same allocation, keeping track of the diff --git a/packages/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol b/packages/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol index 1a84bcd67..31d498c09 100644 --- a/packages/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol +++ b/packages/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol @@ -2,11 +2,15 @@ pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IGraphPayments } from "../IGraphPayments.sol"; import { IHorizonStakingTypes } from "./IHorizonStakingTypes.sol"; /** * @title Inferface for the {HorizonStaking} contract. + * @author Edge & Node * @notice Provides functions for managing stake, provisions, delegations, and slashing. * @dev Note that this interface only includes the functions implemented by {HorizonStaking} contract, * and not those implemented by {HorizonStakingExtension}. @@ -110,7 +114,7 @@ interface IHorizonStakingMain { ); /** - * @dev Emitted when an operator is allowed or denied by a service provider for a particular verifier + * @notice Emitted when an operator is allowed or denied by a service provider for a particular verifier * @param serviceProvider The address of the service provider * @param verifier The address of the verifier * @param operator The address of the operator @@ -289,12 +293,12 @@ interface IHorizonStakingMain { /** * @notice Emitted when a series of thaw requests are fulfilled. + * @param requestType The type of thaw request * @param serviceProvider The address of the service provider * @param verifier The address of the verifier * @param owner The address of the owner of the thaw requests * @param thawRequestsFulfilled The number of thaw requests fulfilled * @param tokens The total amount of tokens being released - * @param requestType The type of thaw request */ event ThawRequestsFulfilled( IHorizonStakingTypes.ThawRequestType indexed requestType, diff --git a/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol b/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol index 0ab84fc1b..1e55221c0 100644 --- a/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol +++ b/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol @@ -2,8 +2,13 @@ pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + /** * @title Defines the data types used in the Horizon staking contract + * @author Edge & Node + * @notice Interface defining data types and structures for Horizon staking * @dev In order to preserve storage compatibility some data structures keep deprecated fields. * These structures have then two representations, an internal one used by the contract storage and a public one. * Getter functions should retrieve internal representations, remove deprecated fields and return the public representation. diff --git a/packages/interfaces/contracts/horizon/internal/ILinkedList.sol b/packages/interfaces/contracts/horizon/internal/ILinkedList.sol index 4a993df29..da21e0d9e 100644 --- a/packages/interfaces/contracts/horizon/internal/ILinkedList.sol +++ b/packages/interfaces/contracts/horizon/internal/ILinkedList.sol @@ -4,6 +4,8 @@ pragma solidity 0.8.27; /** * @title Interface for the {LinkedList} library contract. + * @author Edge & Node + * @notice Interface for managing linked list data structures * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/interfaces/contracts/subgraph-service/IDisputeManager.sol b/packages/interfaces/contracts/subgraph-service/IDisputeManager.sol index e82c96fa9..82026abba 100644 --- a/packages/interfaces/contracts/subgraph-service/IDisputeManager.sol +++ b/packages/interfaces/contracts/subgraph-service/IDisputeManager.sol @@ -2,10 +2,14 @@ pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IAttestation } from "./internal/IAttestation.sol"; /** * @title IDisputeManager + * @author Edge & Node * @notice Interface for the {Dispute Manager} contract. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. @@ -90,7 +94,7 @@ interface IDisputeManager { event SubgraphServiceSet(address indexed subgraphService); /** - * @dev Emitted when a query dispute is created for `subgraphDeploymentId` and `indexer` + * @notice Emitted when a query dispute is created for `subgraphDeploymentId` and `indexer` * by `fisherman`. * The event emits the amount of `tokens` deposited by the fisherman and `attestation` submitted. * @param disputeId The dispute id @@ -99,8 +103,8 @@ interface IDisputeManager { * @param tokens The amount of tokens deposited by the fisherman * @param subgraphDeploymentId The subgraph deployment id * @param attestation The attestation - * @param cancellableAt The timestamp when the dispute can be cancelled * @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute + * @param cancellableAt The timestamp when the dispute can be cancelled */ event QueryDisputeCreated( bytes32 indexed disputeId, @@ -114,7 +118,7 @@ interface IDisputeManager { ); /** - * @dev Emitted when an indexing dispute is created for `allocationId` and `indexer` + * @notice Emitted when an indexing dispute is created for `allocationId` and `indexer` * by `fisherman`. * The event emits the amount of `tokens` deposited by the fisherman. * @param disputeId The dispute id @@ -140,7 +144,7 @@ interface IDisputeManager { ); /** - * @dev Emitted when a legacy dispute is created for `allocationId` and `fisherman`. + * @notice Emitted when a legacy dispute is created for `allocationId` and `fisherman`. * The event emits the amount of `tokensSlash` to slash and `tokensRewards` to reward the fisherman. * @param disputeId The dispute id * @param indexer The indexer address @@ -159,7 +163,7 @@ interface IDisputeManager { ); /** - * @dev Emitted when arbitrator accepts a `disputeId` to `indexer` created by `fisherman`. + * @notice Emitted when arbitrator accepts a `disputeId` to `indexer` created by `fisherman`. * The event emits the amount `tokens` transferred to the fisherman, the deposit plus reward. * @param disputeId The dispute id * @param indexer The indexer address @@ -174,7 +178,7 @@ interface IDisputeManager { ); /** - * @dev Emitted when arbitrator rejects a `disputeId` for `indexer` created by `fisherman`. + * @notice Emitted when arbitrator rejects a `disputeId` for `indexer` created by `fisherman`. * The event emits the amount `tokens` burned from the fisherman deposit. * @param disputeId The dispute id * @param indexer The indexer address @@ -189,7 +193,7 @@ interface IDisputeManager { ); /** - * @dev Emitted when arbitrator draw a `disputeId` for `indexer` created by `fisherman`. + * @notice Emitted when arbitrator draw a `disputeId` for `indexer` created by `fisherman`. * The event emits the amount `tokens` used as deposit and returned to the fisherman. * @param disputeId The dispute id * @param indexer The indexer address @@ -199,7 +203,7 @@ interface IDisputeManager { event DisputeDrawn(bytes32 indexed disputeId, address indexed indexer, address indexed fisherman, uint256 tokens); /** - * @dev Emitted when two disputes are in conflict to link them. + * @notice Emitted when two disputes are in conflict to link them. * This event will be emitted after each DisputeCreated event is emitted * for each of the individual disputes. * @param disputeId1 The first dispute id @@ -208,7 +212,7 @@ interface IDisputeManager { event DisputeLinked(bytes32 indexed disputeId1, bytes32 indexed disputeId2); /** - * @dev Emitted when a dispute is cancelled by the fisherman. + * @notice Emitted when a dispute is cancelled by the fisherman. * The event emits the amount `tokens` returned to the fisherman. * @param disputeId The dispute id * @param indexer The indexer address diff --git a/packages/interfaces/contracts/subgraph-service/ISubgraphService.sol b/packages/interfaces/contracts/subgraph-service/ISubgraphService.sol index 88e48d6d4..3a439a2b3 100644 --- a/packages/interfaces/contracts/subgraph-service/ISubgraphService.sol +++ b/packages/interfaces/contracts/subgraph-service/ISubgraphService.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IDataServiceFees } from "../data-service/IDataServiceFees.sol"; import { IGraphPayments } from "../horizon/IGraphPayments.sol"; @@ -9,6 +12,7 @@ import { ILegacyAllocation } from "./internal/ILegacyAllocation.sol"; /** * @title Interface for the {SubgraphService} contract + * @author Edge & Node * @dev This interface extends {IDataServiceFees} and {IDataService}. * @notice The Subgraph Service is a data service built on top of Graph Horizon that supports the use case of * subgraph indexing and querying. The {SubgraphService} contract implements the flows described in the Data diff --git a/packages/interfaces/contracts/subgraph-service/internal/IAllocation.sol b/packages/interfaces/contracts/subgraph-service/internal/IAllocation.sol index 97b4f1176..e0f55e16a 100644 --- a/packages/interfaces/contracts/subgraph-service/internal/IAllocation.sol +++ b/packages/interfaces/contracts/subgraph-service/internal/IAllocation.sol @@ -4,6 +4,8 @@ pragma solidity 0.8.27; /** * @title Interface for the {Allocation} library contract. + * @author Edge & Node + * @notice Interface for managing allocation data and operations * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/interfaces/contracts/subgraph-service/internal/IAttestation.sol b/packages/interfaces/contracts/subgraph-service/internal/IAttestation.sol index e425a917a..8d7f4cc55 100644 --- a/packages/interfaces/contracts/subgraph-service/internal/IAttestation.sol +++ b/packages/interfaces/contracts/subgraph-service/internal/IAttestation.sol @@ -4,6 +4,8 @@ pragma solidity 0.8.27; /** * @title Interface for the {Attestation} library contract. + * @author Edge & Node + * @notice Interface for managing attestation data and verification * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol b/packages/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol index 74405a439..ad720e170 100644 --- a/packages/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol +++ b/packages/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol @@ -4,6 +4,8 @@ pragma solidity 0.8.27; /** * @title Interface for the {LegacyAllocation} library contract. + * @author Edge & Node + * @notice Interface for managing legacy allocation data * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/interfaces/contracts/token-distribution/IGraphTokenLockWallet.sol b/packages/interfaces/contracts/token-distribution/IGraphTokenLockWallet.sol index 735d35046..4f1f7b0fc 100644 --- a/packages/interfaces/contracts/token-distribution/IGraphTokenLockWallet.sol +++ b/packages/interfaces/contracts/token-distribution/IGraphTokenLockWallet.sol @@ -1,8 +1,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + /** * @title IGraphTokenLockWallet + * @author Edge & Node * @notice Interface for the GraphTokenLockWallet contract that manages locked tokens with vesting schedules * @dev This interface includes core vesting functionality. Protocol interaction functions are in IGraphTokenLockWalletToolshed */ @@ -17,50 +21,157 @@ interface IGraphTokenLockWallet { } // Events + + /// @notice Emitted when the manager is updated + /// @param _oldManager The previous manager address + /// @param _newManager The new manager address event ManagerUpdated(address indexed _oldManager, address indexed _newManager); + + /// @notice Emitted when ownership is transferred + /// @param previousOwner The previous owner address + /// @param newOwner The new owner address event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /// @notice Emitted when token destinations are approved event TokenDestinationsApproved(); + + /// @notice Emitted when token destinations are revoked event TokenDestinationsRevoked(); + + /// @notice Emitted when tokens are released to beneficiary + /// @param beneficiary The beneficiary address + /// @param amount The amount of tokens released event TokensReleased(address indexed beneficiary, uint256 amount); + + /// @notice Emitted when tokens are revoked + /// @param beneficiary The beneficiary address + /// @param amount The amount of tokens revoked event TokensRevoked(address indexed beneficiary, uint256 amount); + + /// @notice Emitted when tokens are withdrawn + /// @param beneficiary The beneficiary address + /// @param amount The amount of tokens withdrawn event TokensWithdrawn(address indexed beneficiary, uint256 amount); // View functions - Vesting Details + + /// @notice Get the beneficiary address + /// @return The beneficiary address function beneficiary() external view returns (address); + + /// @notice Get the token contract address + /// @return The token contract address function token() external view returns (address); + + /// @notice Get the total amount of tokens managed by this contract + /// @return The managed token amount function managedAmount() external view returns (uint256); + + /// @notice Get the vesting start time + /// @return The start time timestamp function startTime() external view returns (uint256); + + /// @notice Get the vesting end time + /// @return The end time timestamp function endTime() external view returns (uint256); + + /// @notice Get the number of vesting periods + /// @return The number of periods function periods() external view returns (uint256); + + /// @notice Get the release start time + /// @return The release start time timestamp function releaseStartTime() external view returns (uint256); + + /// @notice Get the vesting cliff time + /// @return The cliff time timestamp function vestingCliffTime() external view returns (uint256); + + /// @notice Get the revocability status + /// @return The revocability status function revocable() external view returns (Revocability); + + /// @notice Check if the vesting has been revoked + /// @return True if revoked, false otherwise function isRevoked() external view returns (bool); // View functions - Vesting Calculations + + /// @notice Get the current timestamp + /// @return The current timestamp function currentTime() external view returns (uint256); + + /// @notice Get the total vesting duration + /// @return The duration in seconds function duration() external view returns (uint256); + + /// @notice Get the time elapsed since vesting start + /// @return The elapsed time in seconds function sinceStartTime() external view returns (uint256); + + /// @notice Get the amount of tokens released per period + /// @return The amount per period function amountPerPeriod() external view returns (uint256); + + /// @notice Get the duration of each vesting period + /// @return The period duration in seconds function periodDuration() external view returns (uint256); + + /// @notice Get the current vesting period + /// @return The current period number function currentPeriod() external view returns (uint256); + + /// @notice Get the number of periods that have passed + /// @return The number of passed periods function passedPeriods() external view returns (uint256); // View functions - Token Amounts + + /// @notice Get the amount of tokens that can be released + /// @return The releasable token amount function releasableAmount() external view returns (uint256); + + /// @notice Get the amount of tokens that have vested + /// @return The vested token amount function vestedAmount() external view returns (uint256); + + /// @notice Get the amount of tokens that have been released + /// @return The released token amount function releasedAmount() external view returns (uint256); + + /// @notice Get the amount of tokens that have been used + /// @return The used token amount function usedAmount() external view returns (uint256); + + /// @notice Get the current token balance of the contract + /// @return The current balance function currentBalance() external view returns (uint256); + + /// @notice Get the surplus amount of tokens + /// @return The surplus token amount function surplusAmount() external view returns (uint256); + + /// @notice Get the total outstanding token amount + /// @return The total outstanding amount function totalOutstandingAmount() external view returns (uint256); // State-changing functions + + /// @notice Release vested tokens to the beneficiary function release() external; + + /// @notice Withdraw surplus tokens + /// @param _amount The amount of surplus tokens to withdraw function withdrawSurplus(uint256 _amount) external; + + /// @notice Approve protocol interactions function approveProtocol() external; + + /// @notice Revoke protocol interactions function revokeProtocol() external; // Fallback for forwarding calls + + /// @notice Fallback function for forwarding calls fallback() external payable; } diff --git a/packages/interfaces/contracts/toolshed/IControllerToolshed.sol b/packages/interfaces/contracts/toolshed/IControllerToolshed.sol index e4dbd8d41..665911755 100644 --- a/packages/interfaces/contracts/toolshed/IControllerToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IControllerToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { IController } from "../contracts/governance/IController.sol"; import { IGoverned } from "../contracts/governance/IGoverned.sol"; diff --git a/packages/interfaces/contracts/toolshed/IDisputeManagerToolshed.sol b/packages/interfaces/contracts/toolshed/IDisputeManagerToolshed.sol index 0496d3326..a1c1d7601 100644 --- a/packages/interfaces/contracts/toolshed/IDisputeManagerToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IDisputeManagerToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + import { IDisputeManager } from "../subgraph-service/IDisputeManager.sol"; import { IOwnable } from "./internal/IOwnable.sol"; diff --git a/packages/interfaces/contracts/toolshed/IEpochManagerToolshed.sol b/packages/interfaces/contracts/toolshed/IEpochManagerToolshed.sol index 427df1f64..b7be112d2 100644 --- a/packages/interfaces/contracts/toolshed/IEpochManagerToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IEpochManagerToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { IEpochManager } from "../contracts/epochs/IEpochManager.sol"; interface IEpochManagerToolshed is IEpochManager { diff --git a/packages/interfaces/contracts/toolshed/IGraphTallyCollectorToolshed.sol b/packages/interfaces/contracts/toolshed/IGraphTallyCollectorToolshed.sol index f6be272e4..527e34a78 100644 --- a/packages/interfaces/contracts/toolshed/IGraphTallyCollectorToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IGraphTallyCollectorToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + import { IGraphTallyCollector } from "../horizon/IGraphTallyCollector.sol"; interface IGraphTallyCollectorToolshed is IGraphTallyCollector { diff --git a/packages/interfaces/contracts/toolshed/IGraphTokenLockWalletToolshed.sol b/packages/interfaces/contracts/toolshed/IGraphTokenLockWalletToolshed.sol index d442f0c0f..2b2d1af90 100644 --- a/packages/interfaces/contracts/toolshed/IGraphTokenLockWalletToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IGraphTokenLockWalletToolshed.sol @@ -1,11 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { IGraphTokenLockWallet } from "../token-distribution/IGraphTokenLockWallet.sol"; import { IGraphPayments } from "../horizon/IGraphPayments.sol"; /** * @title IGraphTokenLockWalletToolshed + * @author Edge & Node * @notice Extended interface for GraphTokenLockWallet that includes Horizon protocol interaction functions * @dev Functions included are based on the GraphTokenLockManager whitelist for vesting contracts on Horizon */ diff --git a/packages/interfaces/contracts/toolshed/IHorizonStakingToolshed.sol b/packages/interfaces/contracts/toolshed/IHorizonStakingToolshed.sol index b021d3af9..4cd5c5dc4 100644 --- a/packages/interfaces/contracts/toolshed/IHorizonStakingToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IHorizonStakingToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { IHorizonStaking } from "../horizon/IHorizonStaking.sol"; import { IMulticall } from "../contracts/base/IMulticall.sol"; diff --git a/packages/interfaces/contracts/toolshed/IL2CurationToolshed.sol b/packages/interfaces/contracts/toolshed/IL2CurationToolshed.sol index 9b4b81782..b2f4f847b 100644 --- a/packages/interfaces/contracts/toolshed/IL2CurationToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IL2CurationToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { ICuration } from "../contracts/curation/ICuration.sol"; import { IL2Curation } from "../contracts/l2/curation/IL2Curation.sol"; diff --git a/packages/interfaces/contracts/toolshed/IL2GNSToolshed.sol b/packages/interfaces/contracts/toolshed/IL2GNSToolshed.sol index 7cfb3a579..573f79292 100644 --- a/packages/interfaces/contracts/toolshed/IL2GNSToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IL2GNSToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { IGNS } from "../contracts/discovery/IGNS.sol"; import { IL2GNS } from "../contracts/l2/discovery/IL2GNS.sol"; import { IMulticall } from "../contracts/base/IMulticall.sol"; diff --git a/packages/interfaces/contracts/toolshed/IPaymentsEscrowToolshed.sol b/packages/interfaces/contracts/toolshed/IPaymentsEscrowToolshed.sol index e77a0a1b0..63e4ee36e 100644 --- a/packages/interfaces/contracts/toolshed/IPaymentsEscrowToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IPaymentsEscrowToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + import { IPaymentsEscrow } from "../horizon/IPaymentsEscrow.sol"; interface IPaymentsEscrowToolshed is IPaymentsEscrow { diff --git a/packages/interfaces/contracts/toolshed/IRewardsManagerToolshed.sol b/packages/interfaces/contracts/toolshed/IRewardsManagerToolshed.sol index 9fd0b6e1b..0f26080f9 100644 --- a/packages/interfaces/contracts/toolshed/IRewardsManagerToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IRewardsManagerToolshed.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IRewardsManager } from "../contracts/rewards/IRewardsManager.sol"; interface IRewardsManagerToolshed is IRewardsManager { @@ -10,23 +15,23 @@ interface IRewardsManagerToolshed is IRewardsManager { event RewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount); /** - * @dev Emitted when rewards are assigned to an indexer. + * @notice Emitted when rewards are assigned to an indexer (Horizon version) * @dev We use the Horizon prefix to change the event signature which makes network subgraph development much easier */ event HorizonRewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount); /** - * @dev Emitted when rewards are denied to an indexer. + * @notice Emitted when rewards are denied to an indexer */ event RewardsDenied(address indexed indexer, address indexed allocationID); /** - * @dev Emitted when a subgraph is denied for claiming rewards. + * @notice Emitted when a subgraph is denied for claiming rewards */ event RewardsDenylistUpdated(bytes32 indexed subgraphDeploymentID, uint256 sinceBlock); /** - * @dev Emitted when the subgraph service is set + * @notice Emitted when the subgraph service is set */ event SubgraphServiceSet(address indexed oldSubgraphService, address indexed newSubgraphService); diff --git a/packages/interfaces/contracts/toolshed/IServiceRegistryToolshed.sol b/packages/interfaces/contracts/toolshed/IServiceRegistryToolshed.sol index 59155f1f7..cae333ef0 100644 --- a/packages/interfaces/contracts/toolshed/IServiceRegistryToolshed.sol +++ b/packages/interfaces/contracts/toolshed/IServiceRegistryToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.6 || 0.8.27; +// solhint-disable use-natspec + import { IServiceRegistry } from "../contracts/discovery/IServiceRegistry.sol"; interface IServiceRegistryToolshed is IServiceRegistry { diff --git a/packages/interfaces/contracts/toolshed/ISubgraphServiceToolshed.sol b/packages/interfaces/contracts/toolshed/ISubgraphServiceToolshed.sol index 6d684c7ba..c2da4029e 100644 --- a/packages/interfaces/contracts/toolshed/ISubgraphServiceToolshed.sol +++ b/packages/interfaces/contracts/toolshed/ISubgraphServiceToolshed.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + import { ISubgraphService } from "../subgraph-service/ISubgraphService.sol"; import { IOwnable } from "./internal/IOwnable.sol"; import { IPausable } from "./internal/IPausable.sol"; diff --git a/packages/interfaces/contracts/toolshed/internal/IAllocationManager.sol b/packages/interfaces/contracts/toolshed/internal/IAllocationManager.sol index d00b9a9f4..217c44ee6 100644 --- a/packages/interfaces/contracts/toolshed/internal/IAllocationManager.sol +++ b/packages/interfaces/contracts/toolshed/internal/IAllocationManager.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + interface IAllocationManager { // Events event AllocationCreated( diff --git a/packages/interfaces/contracts/toolshed/internal/IOwnable.sol b/packages/interfaces/contracts/toolshed/internal/IOwnable.sol index d5b894c58..be74f7beb 100644 --- a/packages/interfaces/contracts/toolshed/internal/IOwnable.sol +++ b/packages/interfaces/contracts/toolshed/internal/IOwnable.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.27; +// solhint-disable use-natspec + +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + /// @title IOwnable /// @notice Interface for Ownable contracts interface IOwnable { diff --git a/packages/interfaces/contracts/toolshed/internal/IPausable.sol b/packages/interfaces/contracts/toolshed/internal/IPausable.sol index aee534ce3..28def0a70 100644 --- a/packages/interfaces/contracts/toolshed/internal/IPausable.sol +++ b/packages/interfaces/contracts/toolshed/internal/IPausable.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.27; +// solhint-disable use-natspec + /// @title IPausable /// @notice Interface for Pausable contract interface IPausable { diff --git a/packages/interfaces/contracts/toolshed/internal/IProvisionManager.sol b/packages/interfaces/contracts/toolshed/internal/IProvisionManager.sol index 4a536e5e1..31d4b11f7 100644 --- a/packages/interfaces/contracts/toolshed/internal/IProvisionManager.sol +++ b/packages/interfaces/contracts/toolshed/internal/IProvisionManager.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + interface IProvisionManager { // Events event ProvisionTokensRangeSet(uint256 min, uint256 max); diff --git a/packages/interfaces/contracts/toolshed/internal/IProvisionTracker.sol b/packages/interfaces/contracts/toolshed/internal/IProvisionTracker.sol index f474be14e..af9b54b27 100644 --- a/packages/interfaces/contracts/toolshed/internal/IProvisionTracker.sol +++ b/packages/interfaces/contracts/toolshed/internal/IProvisionTracker.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// solhint-disable use-natspec + +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + interface IProvisionTracker { // Errors error ProvisionTrackerInsufficientTokens(uint256 tokensAvailable, uint256 tokensRequired); diff --git a/packages/subgraph-service/contracts/DisputeManager.sol b/packages/subgraph-service/contracts/DisputeManager.sol index 390efb8ce..350816756 100644 --- a/packages/subgraph-service/contracts/DisputeManager.sol +++ b/packages/subgraph-service/contracts/DisputeManager.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping +// solhint-disable gas-strict-inequalities +// solhint-disable function-max-lines + import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; @@ -21,7 +26,8 @@ import { AttestationManager } from "./utilities/AttestationManager.sol"; /** * @title DisputeManager - * @notice Provides a way to permissionlessly create disputes for incorrect behavior in the Subgraph Service. + * @author Edge & Node + * @notice Provides a way to permissionlessly create disputes for incorrect behavior in the Subgraph Service * * There are two types of disputes that can be created: Query disputes and Indexing disputes. * diff --git a/packages/subgraph-service/contracts/DisputeManagerStorage.sol b/packages/subgraph-service/contracts/DisputeManagerStorage.sol index 7441efd00..1cf06f058 100644 --- a/packages/subgraph-service/contracts/DisputeManagerStorage.sol +++ b/packages/subgraph-service/contracts/DisputeManagerStorage.sol @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + pragma solidity 0.8.27; import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; @@ -7,7 +10,8 @@ import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-s /** * @title DisputeManagerStorage - * @notice This contract holds all the storage variables for the Dispute Manager contract. + * @author Edge & Node + * @notice This contract holds all the storage variables for the Dispute Manager contract * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/SubgraphService.sol b/packages/subgraph-service/contracts/SubgraphService.sol index aeb4eb827..37eb8f28e 100644 --- a/packages/subgraph-service/contracts/SubgraphService.sol +++ b/packages/subgraph-service/contracts/SubgraphService.sol @@ -1,6 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities +// solhint-disable function-max-lines + import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; @@ -26,6 +30,8 @@ import { Allocation } from "./libraries/Allocation.sol"; /** * @title SubgraphService contract + * @author Edge & Node + * @notice A data service contract for subgraph indexing and querying * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/SubgraphServiceStorage.sol b/packages/subgraph-service/contracts/SubgraphServiceStorage.sol index 133963347..19ce0fbbe 100644 --- a/packages/subgraph-service/contracts/SubgraphServiceStorage.sol +++ b/packages/subgraph-service/contracts/SubgraphServiceStorage.sol @@ -1,11 +1,15 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; /** * @title SubgraphServiceStorage - * @notice This contract holds all the storage variables for the Subgraph Service contract. + * @author Edge & Node + * @notice This contract holds all the storage variables for the Subgraph Service contract * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/libraries/Allocation.sol b/packages/subgraph-service/contracts/libraries/Allocation.sol index 88f7195b8..5a4e3cb52 100644 --- a/packages/subgraph-service/contracts/libraries/Allocation.sol +++ b/packages/subgraph-service/contracts/libraries/Allocation.sol @@ -7,7 +7,8 @@ import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; /** * @title Allocation library - * @notice A library to handle Allocations. + * @author Edge & Node + * @notice A library to handle Allocations * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/libraries/Attestation.sol b/packages/subgraph-service/contracts/libraries/Attestation.sol index d821fbfbc..25bb6651f 100644 --- a/packages/subgraph-service/contracts/libraries/Attestation.sol +++ b/packages/subgraph-service/contracts/libraries/Attestation.sol @@ -1,11 +1,15 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities + import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; /** * @title Attestation library - * @notice A library to handle Attestation. + * @author Edge & Node + * @notice A library to handle Attestation * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ @@ -44,8 +48,8 @@ library Attestation { uint256 private constant BYTES32_BYTE_LENGTH = 32; /** - * @dev Returns if two attestations are conflicting. - * Everything must match except for the responseId. + * @notice Returns if two attestations are conflicting + * @dev Everything must match except for the responseId * @param _attestation1 Attestation * @param _attestation2 Attestation * @return True if the two attestations are conflicting @@ -60,7 +64,7 @@ library Attestation { } /** - * @dev Parse the bytes attestation into a struct from `_data`. + * @notice Parse the bytes attestation into a struct from `_data` * @param _data The bytes to parse * @return Attestation struct */ @@ -87,7 +91,7 @@ library Attestation { } /** - * @dev Parse a uint8 from `_bytes` starting at offset `_start`. + * @notice Parse a uint8 from `_bytes` starting at offset `_start` * @param _bytes The bytes to parse * @param _start The start offset * @return uint8 value @@ -111,7 +115,7 @@ library Attestation { } /** - * @dev Parse a bytes32 from `_bytes` starting at offset `_start`. + * @notice Parse a bytes32 from `_bytes` starting at offset `_start` * @param _bytes The bytes to parse * @param _start The start offset * @return bytes32 value diff --git a/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol b/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol index 2d73abd91..d24c0bc56 100644 --- a/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol +++ b/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol @@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable named-parameters-mapping + import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol"; /** * @title LegacyAllocation library - * @notice A library to handle legacy Allocations. + * @author Edge & Node + * @notice A library to handle legacy Allocations * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/utilities/AllocationManager.sol b/packages/subgraph-service/contracts/utilities/AllocationManager.sol index e095b3282..746c31f14 100644 --- a/packages/subgraph-service/contracts/utilities/AllocationManager.sol +++ b/packages/subgraph-service/contracts/utilities/AllocationManager.sol @@ -1,6 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events +// solhint-disable gas-small-strings +// solhint-disable function-max-lines + import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; @@ -20,7 +25,8 @@ import { ProvisionTracker } from "@graphprotocol/horizon/contracts/data-service/ /** * @title AllocationManager contract - * @notice A helper contract implementing allocation lifecycle management. + * @author Edge & Node + * @notice A helper contract implementing allocation lifecycle management * Allows opening, resizing, and closing allocations, as well as collecting indexing rewards by presenting a Proof * of Indexing (POI). * @custom:security-contact Please email security+contracts@thegraph.com if you find any @@ -63,8 +69,8 @@ abstract contract AllocationManager is EIP712Upgradeable, GraphDirectory, Alloca * @param tokensIndexerRewards The amount of tokens collected for the indexer * @param tokensDelegationRewards The amount of tokens collected for delegators * @param poi The POI presented - * @param currentEpoch The current epoch * @param poiMetadata The metadata associated with the POI + * @param currentEpoch The current epoch */ event IndexingRewardsCollected( address indexed indexer, @@ -95,7 +101,7 @@ abstract contract AllocationManager is EIP712Upgradeable, GraphDirectory, Alloca ); /** - * @dev Emitted when an indexer closes an allocation + * @notice Emitted when an indexer closes an allocation * @param indexer The address of the indexer * @param allocationId The id of the allocation * @param subgraphDeploymentId The id of the subgraph deployment diff --git a/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol b/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol index 4c0870291..a56e649fd 100644 --- a/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol +++ b/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol @@ -6,7 +6,8 @@ import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph- /** * @title AllocationManagerStorage - * @notice This contract holds all the storage variables for the Allocation Manager contract. + * @author Edge & Node + * @notice This contract holds all the storage variables for the Allocation Manager contract * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/utilities/AttestationManager.sol b/packages/subgraph-service/contracts/utilities/AttestationManager.sol index f385beeb5..2c45fad3a 100644 --- a/packages/subgraph-service/contracts/utilities/AttestationManager.sol +++ b/packages/subgraph-service/contracts/utilities/AttestationManager.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings + import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; import { AttestationManagerV1Storage } from "./AttestationManagerStorage.sol"; @@ -10,7 +13,8 @@ import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/I /** * @title AttestationManager contract - * @notice A helper contract implementing attestation verification. + * @author Edge & Node + * @notice A helper contract implementing attestation verification * Uses a custom implementation of EIP712 for backwards compatibility with attestations. * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. @@ -34,18 +38,18 @@ abstract contract AttestationManager is Initializable, AttestationManagerV1Stora bytes32 private constant DOMAIN_SALT = 0xa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c2; /** - * @dev Initialize the AttestationManager contract and parent contracts + * @notice Initialize the AttestationManager contract and parent contracts */ - // solhint-disable-next-line func-name-mixedcase function __AttestationManager_init() internal onlyInitializing { + // solhint-disable-previous-line func-name-mixedcase __AttestationManager_init_unchained(); } /** - * @dev Initialize the AttestationManager contract + * @notice Initialize the AttestationManager contract */ - // solhint-disable-next-line func-name-mixedcase function __AttestationManager_init_unchained() internal onlyInitializing { + // solhint-disable-previous-line func-name-mixedcase _domainSeparator = keccak256( abi.encode( DOMAIN_TYPE_HASH, @@ -59,7 +63,7 @@ abstract contract AttestationManager is Initializable, AttestationManagerV1Stora } /** - * @dev Recover the signer address of the `_attestation`. + * @notice Recover the signer address of the `_attestation` * @param _attestation The attestation struct * @return Signer address */ diff --git a/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol b/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol index 1c720ec8c..1559a52fa 100644 --- a/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol +++ b/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol @@ -3,7 +3,8 @@ pragma solidity 0.8.27; /** * @title AttestationManagerStorage - * @notice This contract holds all the storage variables for the Attestation Manager contract. + * @author Edge & Node + * @notice This contract holds all the storage variables for the Attestation Manager contract * @custom:security-contact Please email security+contracts@thegraph.com if you find any * bugs. We may have an active bug bounty program. */ diff --git a/packages/subgraph-service/contracts/utilities/Directory.sol b/packages/subgraph-service/contracts/utilities/Directory.sol index 6b96616f4..4bfc1daa0 100644 --- a/packages/subgraph-service/contracts/utilities/Directory.sol +++ b/packages/subgraph-service/contracts/utilities/Directory.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; @@ -8,7 +11,8 @@ import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curatio /** * @title Directory contract - * @notice This contract is meant to be inherited by {SubgraphService} contract. + * @author Edge & Node + * @notice This contract is meant to be inherited by {SubgraphService} contract * It contains the addresses of the contracts that the contract interacts with. * Uses immutable variables to minimize gas costs. * @custom:security-contact Please email security+contracts@thegraph.com if you find any diff --git a/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol b/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol index b3724daae..3423c227d 100644 --- a/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol +++ b/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol @@ -71,6 +71,10 @@ contract MockRewardsManager is IRewardsManager { function calcRewards(uint256, uint256) external pure returns (uint256) {} + // -- Setters -- + + function setRewardsEligibilityOracle(address newRewardsEligibilityOracle) external {} + // -- Updates -- function updateAccRewardsPerSignal() external returns (uint256) {} diff --git a/packages/token-distribution/contracts/GraphTokenDistributor.sol b/packages/token-distribution/contracts/GraphTokenDistributor.sol index a7cd88137..79c2dd399 100644 --- a/packages/token-distribution/contracts/GraphTokenDistributor.sol +++ b/packages/token-distribution/contracts/GraphTokenDistributor.sol @@ -2,10 +2,14 @@ pragma solidity ^0.7.3; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/math/SafeMath.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec, gas-indexed-events, gas-increment-by-one +// solhint-disable named-parameters-mapping + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; /** * @title GraphTokenDistributor diff --git a/packages/token-distribution/contracts/GraphTokenLock.sol b/packages/token-distribution/contracts/GraphTokenLock.sol index 03cfbca43..545b25413 100644 --- a/packages/token-distribution/contracts/GraphTokenLock.sol +++ b/packages/token-distribution/contracts/GraphTokenLock.sol @@ -2,13 +2,16 @@ pragma solidity ^0.7.3; -import "@openzeppelin/contracts/math/SafeMath.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec, gas-indexed-events, gas-strict-inequalities, gas-small-strings + +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import { Ownable as OwnableInitializable } from "./Ownable.sol"; -import "./MathUtils.sol"; -import "./IGraphTokenLock.sol"; +import { MathUtils } from "./MathUtils.sol"; +import { IGraphTokenLock } from "./IGraphTokenLock.sol"; /** * @title GraphTokenLock @@ -54,7 +57,7 @@ abstract contract GraphTokenLock is OwnableInitializable, IGraphTokenLock { // A cliff set a date to which a beneficiary needs to get to vest // all preceding periods uint256 public vestingCliffTime; - Revocability public revocable; // Whether to use vesting for locked funds + IGraphTokenLock.Revocability public revocable; // Whether to use vesting for locked funds // State @@ -103,7 +106,7 @@ abstract contract GraphTokenLock is OwnableInitializable, IGraphTokenLock { uint256 _periods, uint256 _releaseStartTime, uint256 _vestingCliffTime, - Revocability _revocable + IGraphTokenLock.Revocability _revocable ) internal { require(!isInitialized, "Already initialized"); require(_owner != address(0), "Owner cannot be zero"); @@ -113,7 +116,7 @@ abstract contract GraphTokenLock is OwnableInitializable, IGraphTokenLock { require(_startTime != 0, "Start time must be set"); require(_startTime < _endTime, "Start time > end time"); require(_periods >= MIN_PERIOD, "Periods cannot be below minimum"); - require(_revocable != Revocability.NotSet, "Must set a revocability option"); + require(_revocable != IGraphTokenLock.Revocability.NotSet, "Must set a revocability option"); require(_releaseStartTime < _endTime, "Release start time must be before end time"); require(_vestingCliffTime < _endTime, "Cliff time must be before end time"); @@ -271,7 +274,7 @@ abstract contract GraphTokenLock is OwnableInitializable, IGraphTokenLock { */ function vestedAmount() public view override returns (uint256) { // If non-revocable it is fully vested - if (revocable == Revocability.Disabled) { + if (revocable == IGraphTokenLock.Revocability.Disabled) { return managedAmount; } @@ -298,7 +301,11 @@ abstract contract GraphTokenLock is OwnableInitializable, IGraphTokenLock { // Vesting cliff is activated and it has not passed means nothing is vested yet // so funds cannot be released - if (revocable == Revocability.Enabled && vestingCliffTime > 0 && currentTime() < vestingCliffTime) { + if ( + revocable == IGraphTokenLock.Revocability.Enabled && + vestingCliffTime > 0 && + currentTime() < vestingCliffTime + ) { return 0; } @@ -368,7 +375,7 @@ abstract contract GraphTokenLock is OwnableInitializable, IGraphTokenLock { * @dev Vesting schedule is always calculated based on managed tokens */ function revoke() external override onlyOwner { - require(revocable == Revocability.Enabled, "Contract is non-revocable"); + require(revocable == IGraphTokenLock.Revocability.Enabled, "Contract is non-revocable"); require(isRevoked == false, "Already revoked"); uint256 unvestedAmount = managedAmount.sub(vestedAmount()); diff --git a/packages/token-distribution/contracts/GraphTokenLockManager.sol b/packages/token-distribution/contracts/GraphTokenLockManager.sol index 2ec96887e..8eb719685 100644 --- a/packages/token-distribution/contracts/GraphTokenLockManager.sol +++ b/packages/token-distribution/contracts/GraphTokenLockManager.sol @@ -3,14 +3,19 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; -import "@openzeppelin/contracts/utils/EnumerableSet.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec, gas-indexed-events, gas-strict-inequalities, gas-increment-by-one +// solhint-disable named-parameters-mapping + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +import { EnumerableSet } from "@openzeppelin/contracts/utils/EnumerableSet.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import "./MinimalProxyFactory.sol"; -import "./IGraphTokenLockManager.sol"; +import { MinimalProxyFactory } from "./MinimalProxyFactory.sol"; +import { IGraphTokenLockManager } from "./IGraphTokenLockManager.sol"; +import { IGraphTokenLock } from "./IGraphTokenLock.sol"; import { GraphTokenLockWallet } from "./GraphTokenLockWallet.sol"; /** diff --git a/packages/token-distribution/contracts/GraphTokenLockSimple.sol b/packages/token-distribution/contracts/GraphTokenLockSimple.sol index e5b00a3fa..9f0ae48a9 100644 --- a/packages/token-distribution/contracts/GraphTokenLockSimple.sol +++ b/packages/token-distribution/contracts/GraphTokenLockSimple.sol @@ -2,7 +2,12 @@ pragma solidity ^0.7.3; -import "./GraphTokenLock.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { GraphTokenLock } from "./GraphTokenLock.sol"; +import { IGraphTokenLock } from "./IGraphTokenLock.sol"; +import { Ownable as OwnableInitializable } from "./Ownable.sol"; /** * @title GraphTokenLockSimple @@ -29,7 +34,7 @@ contract GraphTokenLockSimple is GraphTokenLock { uint256 _periods, uint256 _releaseStartTime, uint256 _vestingCliffTime, - Revocability _revocable + IGraphTokenLock.Revocability _revocable ) external onlyOwner { _initialize( _owner, diff --git a/packages/token-distribution/contracts/GraphTokenLockWallet.sol b/packages/token-distribution/contracts/GraphTokenLockWallet.sol index 3ac24cb13..cbfaab372 100644 --- a/packages/token-distribution/contracts/GraphTokenLockWallet.sol +++ b/packages/token-distribution/contracts/GraphTokenLockWallet.sol @@ -3,12 +3,15 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/utils/Address.sol"; -import "@openzeppelin/contracts/math/SafeMath.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec, gas-increment-by-one, gas-strict-inequalities, gas-small-strings -import "./GraphTokenLock.sol"; -import "./IGraphTokenLockManager.sol"; +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; + +import { GraphTokenLock, MathUtils } from "./GraphTokenLock.sol"; +import { IGraphTokenLock } from "./IGraphTokenLock.sol"; +import { IGraphTokenLockManager } from "./IGraphTokenLockManager.sol"; /** * @title GraphTokenLockWallet @@ -55,7 +58,7 @@ contract GraphTokenLockWallet is GraphTokenLock { uint256 _periods, uint256 _releaseStartTime, uint256 _vestingCliffTime, - Revocability _revocable + IGraphTokenLock.Revocability _revocable ) external { _initialize( _owner, @@ -130,7 +133,7 @@ contract GraphTokenLockWallet is GraphTokenLock { * @return Amount of tokens ready to be released */ function releasableAmount() public view override returns (uint256) { - if (revocable == Revocability.Disabled) { + if (revocable == IGraphTokenLock.Revocability.Disabled) { return super.releasableAmount(); } @@ -146,7 +149,11 @@ contract GraphTokenLockWallet is GraphTokenLock { // Vesting cliff is activated and it has not passed means nothing is vested yet // so funds cannot be released - if (revocable == Revocability.Enabled && vestingCliffTime > 0 && currentTime() < vestingCliffTime) { + if ( + revocable == IGraphTokenLock.Revocability.Enabled && + vestingCliffTime > 0 && + currentTime() < vestingCliffTime + ) { return 0; } @@ -179,7 +186,7 @@ contract GraphTokenLockWallet is GraphTokenLock { // Tracked used tokens in the protocol // We do this check after balances were updated by the forwarded call // Check is only enforced for revocable contracts to save some gas - if (revocable == Revocability.Enabled) { + if (revocable == IGraphTokenLock.Revocability.Enabled) { // Track contract balance change uint256 newBalance = currentBalance(); if (newBalance < oldBalance) { diff --git a/packages/token-distribution/contracts/ICallhookReceiver.sol b/packages/token-distribution/contracts/ICallhookReceiver.sol index f8f01d56f..8aab3a1e8 100644 --- a/packages/token-distribution/contracts/ICallhookReceiver.sol +++ b/packages/token-distribution/contracts/ICallhookReceiver.sol @@ -10,6 +10,9 @@ */ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + interface ICallhookReceiver { /** * @notice Receive tokens with a callhook from the bridge diff --git a/packages/token-distribution/contracts/IGraphTokenLock.sol b/packages/token-distribution/contracts/IGraphTokenLock.sol index eac89f414..ccdaa004f 100644 --- a/packages/token-distribution/contracts/IGraphTokenLock.sol +++ b/packages/token-distribution/contracts/IGraphTokenLock.sol @@ -3,7 +3,8 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec interface IGraphTokenLock { enum Revocability { diff --git a/packages/token-distribution/contracts/IGraphTokenLockManager.sol b/packages/token-distribution/contracts/IGraphTokenLockManager.sol index c646e5e16..0897f4869 100644 --- a/packages/token-distribution/contracts/IGraphTokenLockManager.sol +++ b/packages/token-distribution/contracts/IGraphTokenLockManager.sol @@ -3,9 +3,12 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec -import "./IGraphTokenLock.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import { IGraphTokenLock } from "./IGraphTokenLock.sol"; interface IGraphTokenLockManager { // -- Factory -- diff --git a/packages/token-distribution/contracts/L1GraphTokenLockTransferTool.sol b/packages/token-distribution/contracts/L1GraphTokenLockTransferTool.sol index 962cf54ee..5e8bbf325 100644 --- a/packages/token-distribution/contracts/L1GraphTokenLockTransferTool.sol +++ b/packages/token-distribution/contracts/L1GraphTokenLockTransferTool.sol @@ -3,6 +3,10 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable function-max-lines, gas-indexed-events, gas-strict-inequalities, use-natspec +// solhint-disable named-parameters-mapping + import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import { ITokenGateway } from "./arbitrum/ITokenGateway.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -38,12 +42,16 @@ contract L1GraphTokenLockTransferTool is OwnableInitializable, Initializable, Mi using SafeMathUpgradeable for uint256; /// Address of the L1 GRT token contract + // solhint-disable-next-line immutable-vars-naming IERC20 public immutable graphToken; /// Address of the L2GraphTokenLockWallet implementation in L2, used to compute L2 wallet addresses + // solhint-disable-next-line immutable-vars-naming address public immutable l2Implementation; /// Address of the L1GraphTokenGateway contract + // solhint-disable-next-line immutable-vars-naming ITokenGateway public immutable l1Gateway; /// Address of the Staking contract, used to pull ETH for L2 ticket gas + // solhint-disable-next-line immutable-vars-naming address payable public immutable staking; /// L2 lock manager for each L1 lock manager. /// L1 GraphTokenLockManager => L2GraphTokenLockManager diff --git a/packages/token-distribution/contracts/L2GraphTokenLockManager.sol b/packages/token-distribution/contracts/L2GraphTokenLockManager.sol index ee1c30a59..f7609cb03 100644 --- a/packages/token-distribution/contracts/L2GraphTokenLockManager.sol +++ b/packages/token-distribution/contracts/L2GraphTokenLockManager.sol @@ -3,6 +3,10 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, use-natspec +// solhint-disable named-parameters-mapping + import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; @@ -42,8 +46,10 @@ contract L2GraphTokenLockManager is GraphTokenLockManager, ICallhookReceiver { } /// Address of the L2GraphTokenGateway + // solhint-disable-next-line immutable-vars-naming address public immutable l2Gateway; /// Address of the L1 transfer tool contract (in L1, no aliasing) + // solhint-disable-next-line immutable-vars-naming address public immutable l1TransferTool; /// Mapping of each L1 wallet to its L2 wallet counterpart (populated when each wallet is received) /// L1 address => L2 address diff --git a/packages/token-distribution/contracts/L2GraphTokenLockTransferTool.sol b/packages/token-distribution/contracts/L2GraphTokenLockTransferTool.sol index 01010a3a0..81f15c960 100644 --- a/packages/token-distribution/contracts/L2GraphTokenLockTransferTool.sol +++ b/packages/token-distribution/contracts/L2GraphTokenLockTransferTool.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-strict-inequalities, use-natspec + import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { L2GraphTokenLockManager } from "./L2GraphTokenLockManager.sol"; @@ -16,10 +19,13 @@ import { ITokenGateway } from "./arbitrum/ITokenGateway.sol"; */ contract L2GraphTokenLockTransferTool { /// Address of the L2 GRT token + // solhint-disable-next-line immutable-vars-naming IERC20 public immutable graphToken; /// Address of the L2GraphTokenGateway + // solhint-disable-next-line immutable-vars-naming ITokenGateway public immutable l2Gateway; /// Address of the L1 GRT token (in L1, no aliasing) + // solhint-disable-next-line immutable-vars-naming address public immutable l1GraphToken; /// @dev Emitted when GRT is sent to L1 from a token lock diff --git a/packages/token-distribution/contracts/L2GraphTokenLockWallet.sol b/packages/token-distribution/contracts/L2GraphTokenLockWallet.sol index 905bee460..3fcba490a 100644 --- a/packages/token-distribution/contracts/L2GraphTokenLockWallet.sol +++ b/packages/token-distribution/contracts/L2GraphTokenLockWallet.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { GraphTokenLockWallet } from "./GraphTokenLockWallet.sol"; diff --git a/packages/token-distribution/contracts/MathUtils.sol b/packages/token-distribution/contracts/MathUtils.sol index 742c52c37..22853c809 100644 --- a/packages/token-distribution/contracts/MathUtils.sol +++ b/packages/token-distribution/contracts/MathUtils.sol @@ -2,6 +2,9 @@ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + library MathUtils { function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; diff --git a/packages/token-distribution/contracts/MinimalProxyFactory.sol b/packages/token-distribution/contracts/MinimalProxyFactory.sol index ca1f03ee1..9da66d95e 100644 --- a/packages/token-distribution/contracts/MinimalProxyFactory.sol +++ b/packages/token-distribution/contracts/MinimalProxyFactory.sol @@ -2,6 +2,9 @@ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { Create2 } from "@openzeppelin/contracts/utils/Create2.sol"; diff --git a/packages/token-distribution/contracts/Ownable.sol b/packages/token-distribution/contracts/Ownable.sol index 73ec22821..4e45fcd25 100644 --- a/packages/token-distribution/contracts/Ownable.sol +++ b/packages/token-distribution/contracts/Ownable.sol @@ -2,6 +2,9 @@ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec, gas-small-strings + /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to diff --git a/packages/token-distribution/contracts/arbitrum/ITokenGateway.sol b/packages/token-distribution/contracts/arbitrum/ITokenGateway.sol index bf2968309..06ec7be0d 100644 --- a/packages/token-distribution/contracts/arbitrum/ITokenGateway.sol +++ b/packages/token-distribution/contracts/arbitrum/ITokenGateway.sol @@ -26,6 +26,9 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + interface ITokenGateway { /// @notice event deprecated in favor of DepositInitiated and WithdrawalInitiated // event OutboundTransferInitiated( diff --git a/packages/token-distribution/contracts/tests/BridgeMock.sol b/packages/token-distribution/contracts/tests/BridgeMock.sol index 643a20428..48bfbbec3 100644 --- a/packages/token-distribution/contracts/tests/BridgeMock.sol +++ b/packages/token-distribution/contracts/tests/BridgeMock.sol @@ -2,7 +2,10 @@ pragma solidity ^0.7.3; -import "./arbitrum/IBridge.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-increment-by-one, use-natspec + +import { IBridge } from "./arbitrum/IBridge.sol"; /** * @title Arbitrum Bridge mock contract diff --git a/packages/token-distribution/contracts/tests/GraphTokenMock.sol b/packages/token-distribution/contracts/tests/GraphTokenMock.sol index bc52b9456..f513c92d6 100644 --- a/packages/token-distribution/contracts/tests/GraphTokenMock.sol +++ b/packages/token-distribution/contracts/tests/GraphTokenMock.sol @@ -2,8 +2,11 @@ pragma solidity ^0.7.3; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; /** * @title Graph Token Mock contract. diff --git a/packages/token-distribution/contracts/tests/InboxMock.sol b/packages/token-distribution/contracts/tests/InboxMock.sol index 9c16ee4ab..fa6b28c82 100644 --- a/packages/token-distribution/contracts/tests/InboxMock.sol +++ b/packages/token-distribution/contracts/tests/InboxMock.sol @@ -2,8 +2,12 @@ pragma solidity ^0.7.3; -import "./arbitrum/IInbox.sol"; -import "./arbitrum/AddressAliasHelper.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { IInbox } from "./arbitrum/IInbox.sol"; +import { AddressAliasHelper } from "./arbitrum/AddressAliasHelper.sol"; +import { IBridge } from "./arbitrum/IBridge.sol"; /** * @title Arbitrum Inbox mock contract diff --git a/packages/token-distribution/contracts/tests/L1TokenGatewayMock.sol b/packages/token-distribution/contracts/tests/L1TokenGatewayMock.sol index 679bcb0ad..8e2fbd11a 100644 --- a/packages/token-distribution/contracts/tests/L1TokenGatewayMock.sol +++ b/packages/token-distribution/contracts/tests/L1TokenGatewayMock.sol @@ -2,6 +2,8 @@ pragma solidity ^0.7.3; +// solhint-disable gas-increment-by-one, gas-indexed-events, gas-strict-inequalities, use-natspec + import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; diff --git a/packages/token-distribution/contracts/tests/L2TokenGatewayMock.sol b/packages/token-distribution/contracts/tests/L2TokenGatewayMock.sol index c9e12dd74..c7794d2b5 100644 --- a/packages/token-distribution/contracts/tests/L2TokenGatewayMock.sol +++ b/packages/token-distribution/contracts/tests/L2TokenGatewayMock.sol @@ -2,6 +2,8 @@ pragma solidity ^0.7.3; +// solhint-disable gas-increment-by-one, gas-indexed-events, use-natspec + import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ITokenGateway } from "../arbitrum//ITokenGateway.sol"; import { GraphTokenMock } from "./GraphTokenMock.sol"; @@ -13,8 +15,10 @@ import { ICallhookReceiver } from "../ICallhookReceiver.sol"; */ contract L2TokenGatewayMock is Ownable { /// Address of the L1 GRT contract + // solhint-disable-next-line immutable-vars-naming address public immutable l1Token; /// Address of the L2 GRT contract + // solhint-disable-next-line immutable-vars-naming address public immutable l2Token; /// Next ID to return when sending an outboundTransfer uint256 public nextId; diff --git a/packages/token-distribution/contracts/tests/Stakes.sol b/packages/token-distribution/contracts/tests/Stakes.sol index bf140aa8f..81d5480fa 100644 --- a/packages/token-distribution/contracts/tests/Stakes.sol +++ b/packages/token-distribution/contracts/tests/Stakes.sol @@ -3,7 +3,10 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/math/SafeMath.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; /** * @title A collection of data structures and functions to manage the Indexer Stake state. diff --git a/packages/token-distribution/contracts/tests/StakingMock.sol b/packages/token-distribution/contracts/tests/StakingMock.sol index 8c5fffc80..b4c1871ed 100644 --- a/packages/token-distribution/contracts/tests/StakingMock.sol +++ b/packages/token-distribution/contracts/tests/StakingMock.sol @@ -3,48 +3,71 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +// solhint-disable named-parameters-mapping +// solhint-disable gas-strict-inequalities -import "./Stakes.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { Stakes } from "./Stakes.sol"; + +/** + * @title StakingMock contract + * @author Edge & Node + * @notice A mock contract for testing staking functionality + */ contract StakingMock { using SafeMath for uint256; using Stakes for Stakes.Indexer; // -- State -- + /// @notice Minimum stake required for indexers uint256 public minimumIndexerStake = 100e18; + /// @notice Thawing period in blocks uint256 public thawingPeriod = 10; // 10 blocks + /// @notice The token contract IERC20 public token; - // Indexer stakes : indexer => Stake + /// @notice Indexer stakes mapping mapping(address => Stakes.Indexer) public stakes; /** - * @dev Emitted when `indexer` stake `tokens` amount. + * @notice Emitted when indexer stakes tokens + * @param indexer The indexer address + * @param tokens The amount of tokens staked */ - event StakeDeposited(address indexed indexer, uint256 tokens); + event StakeDeposited(address indexed indexer, uint256 indexed tokens); /** - * @dev Emitted when `indexer` unstaked and locked `tokens` amount `until` block. + * @notice Emitted when indexer unstakes and locks tokens + * @param indexer The indexer address + * @param tokens The amount of tokens locked + * @param until The block number until which tokens are locked */ - event StakeLocked(address indexed indexer, uint256 tokens, uint256 until); + event StakeLocked(address indexed indexer, uint256 indexed tokens, uint256 indexed until); /** - * @dev Emitted when `indexer` withdrew `tokens` staked. + * @notice Emitted when indexer withdraws staked tokens + * @param indexer The indexer address + * @param tokens The amount of tokens withdrawn */ - event StakeWithdrawn(address indexed indexer, uint256 tokens); + event StakeWithdrawn(address indexed indexer, uint256 indexed tokens); - // Contract constructor. + /** + * @notice Contract constructor + * @param _token The token contract address + */ constructor(IERC20 _token) { require(address(_token) != address(0), "!token"); token = _token; } + /// @notice Receive function to accept ETH receive() external payable {} /** - * @dev Deposit tokens on the indexer stake. + * @notice Deposit tokens on the indexer stake * @param _tokens Amount of tokens to stake */ function stake(uint256 _tokens) external { @@ -52,7 +75,7 @@ contract StakingMock { } /** - * @dev Deposit tokens on the indexer stake. + * @notice Deposit tokens on the indexer stake * @param _indexer Address of the indexer * @param _tokens Amount of tokens to stake */ @@ -70,7 +93,7 @@ contract StakingMock { } /** - * @dev Unstake tokens from the indexer stake, lock them until thawing period expires. + * @notice Unstake tokens from the indexer stake, lock them until thawing period expires * @param _tokens Amount of tokens to unstake */ function unstake(uint256 _tokens) external { @@ -97,12 +120,17 @@ contract StakingMock { } /** - * @dev Withdraw indexer tokens once the thawing period has passed. + * @notice Withdraw indexer tokens once the thawing period has passed */ function withdraw() external { _withdraw(msg.sender); } + /** + * @notice Internal function to stake tokens for an indexer + * @param _indexer Address of the indexer + * @param _tokens Amount of tokens to stake + */ function _stake(address _indexer, uint256 _tokens) internal { // Deposit tokens into the indexer stake Stakes.Indexer storage indexerStake = stakes[_indexer]; @@ -112,7 +140,7 @@ contract StakingMock { } /** - * @dev Withdraw indexer tokens once the thawing period has passed. + * @notice Withdraw indexer tokens once the thawing period has passed * @param _indexer Address of indexer to withdraw funds from */ function _withdraw(address _indexer) private { diff --git a/packages/token-distribution/contracts/tests/WalletMock.sol b/packages/token-distribution/contracts/tests/WalletMock.sol index 872760d6e..b526e547b 100644 --- a/packages/token-distribution/contracts/tests/WalletMock.sol +++ b/packages/token-distribution/contracts/tests/WalletMock.sol @@ -3,6 +3,9 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + import { Address } from "@openzeppelin/contracts/utils/Address.sol"; /** @@ -14,14 +17,19 @@ import { Address } from "@openzeppelin/contracts/utils/Address.sol"; */ contract WalletMock { /// Target contract for the fallback function (usually a transfer tool contract) + // solhint-disable-next-line immutable-vars-naming address public immutable target; /// Address of the GRT (mock) token + // solhint-disable-next-line immutable-vars-naming address public immutable token; /// Address of the wallet's manager + // solhint-disable-next-line immutable-vars-naming address public immutable manager; /// Whether the wallet has been initialized + // solhint-disable-next-line immutable-vars-naming bool public immutable isInitialized; /// Whether the beneficiary has accepted the lock + // solhint-disable-next-line immutable-vars-naming bool public immutable isAccepted; /** diff --git a/packages/token-distribution/contracts/tests/arbitrum/AddressAliasHelper.sol b/packages/token-distribution/contracts/tests/arbitrum/AddressAliasHelper.sol index 146c1c876..525e71640 100644 --- a/packages/token-distribution/contracts/tests/arbitrum/AddressAliasHelper.sol +++ b/packages/token-distribution/contracts/tests/arbitrum/AddressAliasHelper.sol @@ -25,8 +25,12 @@ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + library AddressAliasHelper { - uint160 constant offset = uint160(0x1111000000000000000000000000000000001111); + // solhint-disable-next-line const-name-snakecase + uint160 internal constant offset = uint160(0x1111000000000000000000000000000000001111); /// @notice Utility function that converts the address in the L1 that submitted a tx to /// the inbox to the msg.sender viewed in the L2 diff --git a/packages/token-distribution/contracts/tests/arbitrum/IBridge.sol b/packages/token-distribution/contracts/tests/arbitrum/IBridge.sol index fdfa34eed..f4ace5767 100644 --- a/packages/token-distribution/contracts/tests/arbitrum/IBridge.sol +++ b/packages/token-distribution/contracts/tests/arbitrum/IBridge.sol @@ -25,6 +25,9 @@ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec, gas-indexed-events + interface IBridge { event MessageDelivered( uint256 indexed messageIndex, diff --git a/packages/token-distribution/contracts/tests/arbitrum/IInbox.sol b/packages/token-distribution/contracts/tests/arbitrum/IInbox.sol index 0a6e78dc3..a3b7b096a 100644 --- a/packages/token-distribution/contracts/tests/arbitrum/IInbox.sol +++ b/packages/token-distribution/contracts/tests/arbitrum/IInbox.sol @@ -25,8 +25,11 @@ pragma solidity ^0.7.3; -import "./IBridge.sol"; -import "./IMessageProvider.sol"; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + +import { IBridge } from "./IBridge.sol"; +import { IMessageProvider } from "./IMessageProvider.sol"; interface IInbox is IMessageProvider { function sendL2Message(bytes calldata messageData) external returns (uint256); diff --git a/packages/token-distribution/contracts/tests/arbitrum/IMessageProvider.sol b/packages/token-distribution/contracts/tests/arbitrum/IMessageProvider.sol index cf8446af2..28b3937e8 100644 --- a/packages/token-distribution/contracts/tests/arbitrum/IMessageProvider.sol +++ b/packages/token-distribution/contracts/tests/arbitrum/IMessageProvider.sol @@ -25,6 +25,9 @@ pragma solidity ^0.7.3; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable use-natspec + interface IMessageProvider { event InboxMessageDelivered(uint256 indexed messageNum, bytes data); From 6009501906004eb512f921fcfdab43d510633327 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 6 Oct 2025 21:30:49 +0000 Subject: [PATCH 03/10] fix: undoing bytecode changing source change --- packages/contracts/contracts/disputes/DisputeManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts/contracts/disputes/DisputeManager.sol b/packages/contracts/contracts/disputes/DisputeManager.sol index ba3e25efd..51c28e5db 100644 --- a/packages/contracts/contracts/disputes/DisputeManager.sol +++ b/packages/contracts/contracts/disputes/DisputeManager.sol @@ -515,9 +515,9 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa address _fisherman, uint256 _deposit, address _allocationID - ) private returns (bytes32 disputeID) { + ) private returns (bytes32) { // Create a disputeID - disputeID = keccak256(abi.encodePacked(_allocationID)); + bytes32 disputeID = keccak256(abi.encodePacked(_allocationID)); // Only one dispute for an allocationID at a time require(!isDisputeCreated(disputeID), "Dispute already created"); From 804da6c45e5ccac2e22bb079efcea75e4893b561 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:01:15 +0000 Subject: [PATCH 04/10] feat: scripts/bytecode-diff-no-metadata.sh --- scripts/bytecode-diff-no-metadata.sh | 168 +++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100755 scripts/bytecode-diff-no-metadata.sh diff --git a/scripts/bytecode-diff-no-metadata.sh b/scripts/bytecode-diff-no-metadata.sh new file mode 100755 index 000000000..9c8e1bc3c --- /dev/null +++ b/scripts/bytecode-diff-no-metadata.sh @@ -0,0 +1,168 @@ +#!/usr/bin/env bash +# +# Bytecode Comparison Tool (Metadata-Stripped) +# +# Compares functional bytecode between two contract artifact directories, +# excluding metadata hashes to focus on actual code differences. +# +# This is an enhanced version of bytecode-diff.sh that strips Solidity +# metadata hashes before comparison, allowing you to identify functional +# differences vs compilation environment differences. +# +# Usage: ./bytecode-diff-no-metadata.sh +# Example: ./bytecode-diff-no-metadata.sh /path/to/old/artifacts /path/to/new/artifacts +# +# Metadata Pattern Stripped: a264697066735822[64 hex chars]64736f6c63[6 hex chars] +# This represents: "ipfs" + IPFS hash + "solc" + Solidity version +# + +set -euo pipefail + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + echo "This script compares bytecode excluding metadata hashes" + echo "Metadata hashes are embedded by Solidity and don't affect contract functionality" + exit 1 +fi + +DIR1="$1" +DIR2="$2" + +TMPDIR=$(mktemp -d) + +# Function to extract bytecode and strip metadata hash +strip_metadata() { + local file="$1" + local out="$2" + + # Extract bytecode + local bytecode=$(jq -r '.bytecode' "$file") + + # Remove 0x prefix if present + bytecode=${bytecode#0x} + + # Strip metadata hash - Solidity metadata follows pattern: + # a264697066735822<32-byte-hash>64736f6c63 + # Where: + # - a264697066735822 = "ipfs" in hex + length prefix + # - 64736f6c63 = "solc" in hex + # We'll remove everything from the last occurrence of a264697066735822 to the end + + # Use sed to remove the metadata pattern from the end + # This removes everything from a264697066735822 (ipfs marker) to the end + bytecode=$(echo "$bytecode" | sed 's/a264697066735822.*$//') + + # Output in chunks of 64 characters for easier diffing + echo "$bytecode" | fold -w 64 > "$out" +} + +echo "๐Ÿ” Comparing bytecode (excluding metadata hashes) for repository contracts..." +echo "DIR1: $DIR1" +echo "DIR2: $DIR2" +echo + +# Create lists of contracts in each directory +contracts1="$TMPDIR/contracts1.txt" +contracts2="$TMPDIR/contracts2.txt" + +find "$DIR1/contracts" -type f -name '*.json' ! -name '*dbg.json' ! -name 'I*.json' 2>/dev/null | while read -r file; do + rel_path="${file#$DIR1/contracts/}" + echo "$rel_path" +done | sort > "$contracts1" + +find "$DIR2/contracts" -type f -name '*.json' ! -name '*dbg.json' ! -name 'I*.json' 2>/dev/null | while read -r file; do + rel_path="${file#$DIR2/contracts/}" + echo "$rel_path" +done | sort > "$contracts2" + +# Find common contracts +common_contracts="$TMPDIR/common.txt" +comm -12 "$contracts1" "$contracts2" > "$common_contracts" + +common_count=$(wc -l < "$common_contracts") +echo "๐Ÿ“Š Found $common_count common contracts to compare" +echo + +if [ "$common_count" -eq 0 ]; then + echo "โŒ No common contracts found!" + exit 1 +fi + +# Compare bytecode for common contracts +diff_count=0 +same_count=0 +no_bytecode_count=0 + +# Store results for summary +same_contracts="$TMPDIR/same.txt" +diff_contracts="$TMPDIR/different.txt" +touch "$same_contracts" "$diff_contracts" + +echo "Processing contracts..." + +while read -r contract; do + file1="$DIR1/contracts/$contract" + file2="$DIR2/contracts/$contract" + + # Extract and strip metadata + tmp1="$TMPDIR/1" + tmp2="$TMPDIR/2" + + strip_metadata "$file1" "$tmp1" + strip_metadata "$file2" "$tmp2" + + # Skip if no bytecode (interfaces, abstract contracts) + if [ ! -s "$tmp1" ] || [ "$(wc -c < "$tmp1")" -le 3 ]; then + no_bytecode_count=$((no_bytecode_count + 1)) + continue + fi + + contract_name=$(jq -r '.contractName // "Unknown"' "$file1" 2>/dev/null || echo "Unknown") + + if ! diff -q "$tmp1" "$tmp2" > /dev/null; then + diff_count=$((diff_count + 1)) + echo "$contract ($contract_name)" >> "$diff_contracts" + echo "๐Ÿงจ $contract" + else + same_count=$((same_count + 1)) + echo "$contract ($contract_name)" >> "$same_contracts" + echo "โœ… $contract" + fi +done < "$common_contracts" + +echo +echo "๐Ÿ“‹ SUMMARY LISTS:" +echo +echo "โœ… FUNCTIONALLY IDENTICAL ($same_count contracts):" +if [ -s "$same_contracts" ]; then + cat "$same_contracts" | sed 's/^/ - /' +else + echo " (none)" +fi + +echo +echo "๐Ÿงจ FUNCTIONAL DIFFERENCES ($diff_count contracts):" +if [ -s "$diff_contracts" ]; then + cat "$diff_contracts" | sed 's/^/ - /' +else + echo " (none)" +fi + +echo +echo "๐Ÿ“Š Final Summary:" +echo " Total contracts compared: $((same_count + diff_count))" +echo " No bytecode (interfaces/abstract): $no_bytecode_count" +echo " Functionally identical: $same_count" +echo " Functional differences: $diff_count" + +if [ "$diff_count" -eq 0 ]; then + echo + echo "๐ŸŽ‰ SUCCESS: All contracts are functionally identical!" + echo " The previous differences were only in metadata hashes." +else + echo + echo "โš ๏ธ ATTENTION: Found $diff_count contracts with functional differences!" + echo " These contracts have actual code changes that affect functionality." +fi + +rm -rf "$TMPDIR" From a485a59b58d614b77996c08e305279a0ccb06015 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 7 Oct 2025 08:32:30 +0000 Subject: [PATCH 05/10] feat: add test:coverage script to packages/contracts --- packages/contracts/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 090757e8a..d10af6e6f 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -33,6 +33,7 @@ "build:self": "pnpm compile", "compile": "hardhat compile", "test": "pnpm --filter @graphprotocol/contracts-tests test", + "test:coverage": "pnpm --filter @graphprotocol/contracts-tests run test:coverage", "deploy": "pnpm predeploy && pnpm build", "deploy-localhost": "pnpm build", "predeploy": "scripts/predeploy", From 183dc08fa2277c36cd4b47ad83c4e7ab1b33ea27 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:41:49 +0000 Subject: [PATCH 06/10] fix(token-distribution): replace @graphql-mesh/utils with local gql implementation - Replace missing @graphql-mesh/utils dependency with simple local gql function - Update extraction script to generate self-contained artifacts - Fixes Hardhat initialization error: 'Cannot find module @graphql-mesh/utils' - Maintains functionality while avoiding unnecessary dependency --- .../token-distribution/.graphclient-extracted/index.js | 9 ++++++++- .../token-distribution/scripts/extract-graphclient.js | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/token-distribution/.graphclient-extracted/index.js b/packages/token-distribution/.graphclient-extracted/index.js index 649390e14..63a3640f6 100644 --- a/packages/token-distribution/.graphclient-extracted/index.js +++ b/packages/token-distribution/.graphclient-extracted/index.js @@ -2,7 +2,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); // Minimal GraphClient for offline builds - contains only what ops/info.ts uses -const { gql } = require('@graphql-mesh/utils'); +// Simple gql template literal function (replacement for @graphql-mesh/utils) +const gql = (strings, ...values) => { + let result = strings[0]; + for (let i = 0; i < values.length; i++) { + result += values[i] + strings[i + 1]; + } + return result; +}; // Mock execute function const execute = () => { diff --git a/packages/token-distribution/scripts/extract-graphclient.js b/packages/token-distribution/scripts/extract-graphclient.js index 771abc74b..1f2572a44 100644 --- a/packages/token-distribution/scripts/extract-graphclient.js +++ b/packages/token-distribution/scripts/extract-graphclient.js @@ -135,7 +135,14 @@ function createMinimalJs(content, neededQueries) { Object.defineProperty(exports, "__esModule", { value: true }); // Minimal GraphClient for offline builds - contains only what ops/info.ts uses -const { gql } = require('@graphql-mesh/utils'); +// Simple gql template literal function (replacement for @graphql-mesh/utils) +const gql = (strings, ...values) => { + let result = strings[0]; + for (let i = 0; i < values.length; i++) { + result += values[i] + strings[i + 1]; + } + return result; +}; // Mock execute function const execute = () => { From 3bbd5869466b9a01425c31bc61c2facf625f39b3 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:44:45 +0000 Subject: [PATCH 07/10] chore: update ethereumjs-util dependency in lock file - Update ethereumjs-util from 7.1.3 to 7.1.5 - Ensures consistent dependency versions across environments --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9f31a0a0..5050f7ed2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13259,7 +13259,7 @@ snapshots: '@ethereumjs/common@2.6.0': dependencies: crc-32: 1.2.2 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.5 '@ethereumjs/common@2.6.5': dependencies: @@ -13281,7 +13281,7 @@ snapshots: '@ethereumjs/tx@3.4.0': dependencies: '@ethereumjs/common': 2.6.0 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.5 '@ethereumjs/tx@3.5.2': dependencies: @@ -13308,7 +13308,7 @@ snapshots: async-eventemitter: 0.2.4 core-js-pure: 3.45.1 debug: 2.6.9 - ethereumjs-util: 7.1.3 + ethereumjs-util: 7.1.5 functional-red-black-tree: 1.0.1 mcl-wasm: 0.7.9 merkle-patricia-tree: 4.2.4 From 644100475ba56e137db2abafbe6a17b6c6601626 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 7 Oct 2025 16:50:12 +0000 Subject: [PATCH 08/10] feat: upgrade OpenZeppelin contracts from v3.4.1 to v3.4.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update @openzeppelin/contracts from 3.4.1 to 3.4.2 in all packages - Verified 98 contracts across 4 packages show no functional differences - Only metadata hashes changed as expected Package updates: - packages/contracts/package.json - packages/interfaces/package.json - packages/token-distribution/package.json - packages/contracts/task/package.json - packages/contracts/test/package.json Script improvements: - Add compare-repo-contract-bytecode-excluding-metadata.py for reliable repo comparisons - Remove obsolete bytecode-diff-no-metadata.sh script Verification completed: - contracts: 55 contracts โœ… functionally identical - token-distribution: 20 contracts โœ… functionally identical - horizon: 33 contracts โœ… functionally identical - subgraph-service: 12 contracts โœ… functionally identical --- packages/contracts/package.json | 2 +- packages/contracts/task/package.json | 2 +- packages/contracts/test/package.json | 2 +- packages/interfaces/package.json | 2 +- packages/token-distribution/package.json | 2 +- pnpm-lock.yaml | 26 +- scripts/bytecode-diff-no-metadata.sh | 168 ------------ ...po-contract-bytecode-excluding-metadata.py | 240 ++++++++++++++++++ 8 files changed, 258 insertions(+), 186 deletions(-) delete mode 100755 scripts/bytecode-diff-no-metadata.sh create mode 100755 scripts/compare-repo-contract-bytecode-excluding-metadata.py diff --git a/packages/contracts/package.json b/packages/contracts/package.json index d10af6e6f..4d751b014 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -63,7 +63,7 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.6", - "@openzeppelin/contracts": "^3.4.1", + "@openzeppelin/contracts": "3.4.2", "@openzeppelin/contracts-upgradeable": "3.4.2", "@openzeppelin/hardhat-upgrades": "^1.22.1", "@typechain/ethers-v5": "^10.2.1", diff --git a/packages/contracts/task/package.json b/packages/contracts/task/package.json index c45cc594a..537750b5f 100644 --- a/packages/contracts/task/package.json +++ b/packages/contracts/task/package.json @@ -28,7 +28,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@openzeppelin/contracts": "^3.4.1", + "@openzeppelin/contracts": "3.4.2", "@openzeppelin/contracts-upgradeable": "3.4.2", "@openzeppelin/hardhat-upgrades": "^1.22.1", "@typechain/ethers-v5": "^10.2.1", diff --git a/packages/contracts/test/package.json b/packages/contracts/test/package.json index 2deffeef2..9b564484f 100644 --- a/packages/contracts/test/package.json +++ b/packages/contracts/test/package.json @@ -20,7 +20,7 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.6", - "@openzeppelin/contracts": "^3.4.1", + "@openzeppelin/contracts": "3.4.2", "@openzeppelin/contracts-upgradeable": "3.4.2", "@openzeppelin/hardhat-upgrades": "^1.22.1", "@typechain/ethers-v5": "^10.2.1", diff --git a/packages/interfaces/package.json b/packages/interfaces/package.json index de7fe799e..c4e0e94ad 100644 --- a/packages/interfaces/package.json +++ b/packages/interfaces/package.json @@ -48,7 +48,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^4.0.0", - "@openzeppelin/contracts": "3.4.1", + "@openzeppelin/contracts": "3.4.2", "@openzeppelin/contracts-upgradeable": "3.4.2", "@typechain/ethers-v5": "^10.2.1", "@wagmi/cli": "^2.3.1", diff --git a/packages/token-distribution/package.json b/packages/token-distribution/package.json index 3288bb0ee..74d35d400 100644 --- a/packages/token-distribution/package.json +++ b/packages/token-distribution/package.json @@ -50,7 +50,7 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.6", - "@openzeppelin/contracts": "^3.4.1", + "@openzeppelin/contracts": "3.4.2", "@openzeppelin/contracts-upgradeable": "3.4.2", "@openzeppelin/hardhat-upgrades": "^1.22.1", "@typechain/ethers-v5": "^10.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5050f7ed2..f1ace7878 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -221,8 +221,8 @@ importers: specifier: ^2.0.6 version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': - specifier: ^3.4.1 - version: 3.4.1 + specifier: 3.4.2 + version: 3.4.2 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 version: 3.4.2 @@ -369,8 +369,8 @@ importers: specifier: ^3.1.0 version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': - specifier: ^3.4.1 - version: 3.4.1 + specifier: 3.4.2 + version: 3.4.2 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 version: 3.4.2 @@ -502,8 +502,8 @@ importers: specifier: ^2.0.6 version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': - specifier: ^3.4.1 - version: 3.4.1 + specifier: 3.4.2 + version: 3.4.2 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 version: 3.4.2 @@ -899,8 +899,8 @@ importers: specifier: ^4.0.0 version: 4.0.0(6b332ee552128839aebadf34f365d923) '@openzeppelin/contracts': - specifier: 3.4.1 - version: 3.4.1 + specifier: 3.4.2 + version: 3.4.2 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 version: 3.4.2 @@ -1104,8 +1104,8 @@ importers: specifier: ^2.0.6 version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.19)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': - specifier: ^3.4.1 - version: 3.4.1 + specifier: 3.4.2 + version: 3.4.2 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 version: 3.4.2 @@ -3428,8 +3428,8 @@ packages: peerDependencies: '@openzeppelin/contracts': 5.4.0 - '@openzeppelin/contracts@3.4.1': - resolution: {integrity: sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ==} + '@openzeppelin/contracts@3.4.2': + resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} '@openzeppelin/contracts@4.9.6': resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} @@ -15731,7 +15731,7 @@ snapshots: dependencies: '@openzeppelin/contracts': 5.4.0 - '@openzeppelin/contracts@3.4.1': {} + '@openzeppelin/contracts@3.4.2': {} '@openzeppelin/contracts@4.9.6': {} diff --git a/scripts/bytecode-diff-no-metadata.sh b/scripts/bytecode-diff-no-metadata.sh deleted file mode 100755 index 9c8e1bc3c..000000000 --- a/scripts/bytecode-diff-no-metadata.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env bash -# -# Bytecode Comparison Tool (Metadata-Stripped) -# -# Compares functional bytecode between two contract artifact directories, -# excluding metadata hashes to focus on actual code differences. -# -# This is an enhanced version of bytecode-diff.sh that strips Solidity -# metadata hashes before comparison, allowing you to identify functional -# differences vs compilation environment differences. -# -# Usage: ./bytecode-diff-no-metadata.sh -# Example: ./bytecode-diff-no-metadata.sh /path/to/old/artifacts /path/to/new/artifacts -# -# Metadata Pattern Stripped: a264697066735822[64 hex chars]64736f6c63[6 hex chars] -# This represents: "ipfs" + IPFS hash + "solc" + Solidity version -# - -set -euo pipefail - -if [ "$#" -ne 2 ]; then - echo "Usage: $0 " - echo "This script compares bytecode excluding metadata hashes" - echo "Metadata hashes are embedded by Solidity and don't affect contract functionality" - exit 1 -fi - -DIR1="$1" -DIR2="$2" - -TMPDIR=$(mktemp -d) - -# Function to extract bytecode and strip metadata hash -strip_metadata() { - local file="$1" - local out="$2" - - # Extract bytecode - local bytecode=$(jq -r '.bytecode' "$file") - - # Remove 0x prefix if present - bytecode=${bytecode#0x} - - # Strip metadata hash - Solidity metadata follows pattern: - # a264697066735822<32-byte-hash>64736f6c63 - # Where: - # - a264697066735822 = "ipfs" in hex + length prefix - # - 64736f6c63 = "solc" in hex - # We'll remove everything from the last occurrence of a264697066735822 to the end - - # Use sed to remove the metadata pattern from the end - # This removes everything from a264697066735822 (ipfs marker) to the end - bytecode=$(echo "$bytecode" | sed 's/a264697066735822.*$//') - - # Output in chunks of 64 characters for easier diffing - echo "$bytecode" | fold -w 64 > "$out" -} - -echo "๐Ÿ” Comparing bytecode (excluding metadata hashes) for repository contracts..." -echo "DIR1: $DIR1" -echo "DIR2: $DIR2" -echo - -# Create lists of contracts in each directory -contracts1="$TMPDIR/contracts1.txt" -contracts2="$TMPDIR/contracts2.txt" - -find "$DIR1/contracts" -type f -name '*.json' ! -name '*dbg.json' ! -name 'I*.json' 2>/dev/null | while read -r file; do - rel_path="${file#$DIR1/contracts/}" - echo "$rel_path" -done | sort > "$contracts1" - -find "$DIR2/contracts" -type f -name '*.json' ! -name '*dbg.json' ! -name 'I*.json' 2>/dev/null | while read -r file; do - rel_path="${file#$DIR2/contracts/}" - echo "$rel_path" -done | sort > "$contracts2" - -# Find common contracts -common_contracts="$TMPDIR/common.txt" -comm -12 "$contracts1" "$contracts2" > "$common_contracts" - -common_count=$(wc -l < "$common_contracts") -echo "๐Ÿ“Š Found $common_count common contracts to compare" -echo - -if [ "$common_count" -eq 0 ]; then - echo "โŒ No common contracts found!" - exit 1 -fi - -# Compare bytecode for common contracts -diff_count=0 -same_count=0 -no_bytecode_count=0 - -# Store results for summary -same_contracts="$TMPDIR/same.txt" -diff_contracts="$TMPDIR/different.txt" -touch "$same_contracts" "$diff_contracts" - -echo "Processing contracts..." - -while read -r contract; do - file1="$DIR1/contracts/$contract" - file2="$DIR2/contracts/$contract" - - # Extract and strip metadata - tmp1="$TMPDIR/1" - tmp2="$TMPDIR/2" - - strip_metadata "$file1" "$tmp1" - strip_metadata "$file2" "$tmp2" - - # Skip if no bytecode (interfaces, abstract contracts) - if [ ! -s "$tmp1" ] || [ "$(wc -c < "$tmp1")" -le 3 ]; then - no_bytecode_count=$((no_bytecode_count + 1)) - continue - fi - - contract_name=$(jq -r '.contractName // "Unknown"' "$file1" 2>/dev/null || echo "Unknown") - - if ! diff -q "$tmp1" "$tmp2" > /dev/null; then - diff_count=$((diff_count + 1)) - echo "$contract ($contract_name)" >> "$diff_contracts" - echo "๐Ÿงจ $contract" - else - same_count=$((same_count + 1)) - echo "$contract ($contract_name)" >> "$same_contracts" - echo "โœ… $contract" - fi -done < "$common_contracts" - -echo -echo "๐Ÿ“‹ SUMMARY LISTS:" -echo -echo "โœ… FUNCTIONALLY IDENTICAL ($same_count contracts):" -if [ -s "$same_contracts" ]; then - cat "$same_contracts" | sed 's/^/ - /' -else - echo " (none)" -fi - -echo -echo "๐Ÿงจ FUNCTIONAL DIFFERENCES ($diff_count contracts):" -if [ -s "$diff_contracts" ]; then - cat "$diff_contracts" | sed 's/^/ - /' -else - echo " (none)" -fi - -echo -echo "๐Ÿ“Š Final Summary:" -echo " Total contracts compared: $((same_count + diff_count))" -echo " No bytecode (interfaces/abstract): $no_bytecode_count" -echo " Functionally identical: $same_count" -echo " Functional differences: $diff_count" - -if [ "$diff_count" -eq 0 ]; then - echo - echo "๐ŸŽ‰ SUCCESS: All contracts are functionally identical!" - echo " The previous differences were only in metadata hashes." -else - echo - echo "โš ๏ธ ATTENTION: Found $diff_count contracts with functional differences!" - echo " These contracts have actual code changes that affect functionality." -fi - -rm -rf "$TMPDIR" diff --git a/scripts/compare-repo-contract-bytecode-excluding-metadata.py b/scripts/compare-repo-contract-bytecode-excluding-metadata.py new file mode 100755 index 000000000..8ac116dbf --- /dev/null +++ b/scripts/compare-repo-contract-bytecode-excluding-metadata.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +""" +Repository Comparison Script + +Compares contract artifacts between two repository directories to detect functional differences. +This is useful for verifying that dependency upgrades or other changes don't affect contract bytecode. + +Usage: ./scripts/compare-repos.py +Example: ./scripts/compare-repos.py /path/to/repo-v3.4.1 /path/to/repo-v3.4.2 + +The script will: +1. Auto-discover all artifact directories in both repositories +2. Find matching contracts between the repositories +3. Compare bytecode while stripping metadata hashes +4. Report functional differences +""" + +import os +import sys +import json +import re +from pathlib import Path +from typing import Dict, List, Tuple, Optional, Set + + +def strip_metadata(bytecode: str) -> str: + """ + Strip Solidity metadata hash from bytecode to focus on functional differences. + + Metadata hash pattern: a264697066735822<32-byte-hash>64736f6c63 + Where: a264697066735822 = "ipfs" in hex, 64736f6c63 = "solc" in hex + """ + if bytecode.startswith('0x'): + bytecode = bytecode[2:] + + # Remove metadata hash pattern + return re.sub(r'a264697066735822.*', '', bytecode) + + +def get_contract_bytecode(artifact_file: Path) -> Optional[str]: + """Extract and process bytecode from contract artifact JSON file.""" + try: + with open(artifact_file, 'r') as f: + artifact = json.load(f) + + bytecode = artifact.get('bytecode', '') + if not bytecode or bytecode == '0x': + return None + + return strip_metadata(bytecode) + except (json.JSONDecodeError, FileNotFoundError, KeyError): + return None + + +def find_artifact_directories(repo_path: Path) -> List[Tuple[str, Path]]: + """ + Find all artifact directories in a repository. + Returns list of (package_name, artifact_path) tuples. + """ + artifact_dirs = [] + + # Standard artifact patterns + patterns = [ + "packages/*/artifacts", + "packages/*/build/artifacts", + "packages/*/build/contracts" + ] + + for pattern in patterns: + for artifact_dir in repo_path.glob(pattern): + if artifact_dir.is_dir(): + # Extract package name from path + parts = artifact_dir.relative_to(repo_path).parts + if len(parts) >= 2 and parts[0] == "packages": + package_name = parts[1] + artifact_dirs.append((package_name, artifact_dir)) + + return artifact_dirs + + +def find_contract_artifacts(artifact_dir: Path) -> Dict[str, Path]: + """ + Find all contract artifact JSON files in an artifact directory. + Returns dict mapping relative_path -> absolute_path. + """ + contracts = {} + + for json_file in artifact_dir.rglob("*.json"): + # Skip debug files and interface files + if json_file.name.endswith('.dbg.json'): + continue + if json_file.name.startswith('I') and not json_file.name.startswith('IL'): + continue + + # Get relative path from artifact directory + rel_path = json_file.relative_to(artifact_dir) + contracts[str(rel_path)] = json_file + + return contracts + + +def compare_repositories(repo1_path: Path, repo2_path: Path) -> None: + """Compare contract artifacts between two repositories.""" + + print(f"๐Ÿ” Comparing repositories:") + print(f" Repo 1: {repo1_path}") + print(f" Repo 2: {repo2_path}") + print(f" Excluding metadata hashes to focus on functional differences\n") + + # Find artifact directories in both repos + repo1_artifacts = find_artifact_directories(repo1_path) + repo2_artifacts = find_artifact_directories(repo2_path) + + # Group by package name + repo1_packages = {pkg: path for pkg, path in repo1_artifacts} + repo2_packages = {pkg: path for pkg, path in repo2_artifacts} + + # Find common packages + common_packages = set(repo1_packages.keys()) & set(repo2_packages.keys()) + + if not common_packages: + print("โŒ No common packages found between repositories!") + return + + total_compared = 0 + total_identical = 0 + total_different = 0 + total_no_bytecode = 0 + + identical_contracts = [] + different_contracts = [] + + for package in sorted(common_packages): + print(f"๐Ÿ” Comparing {package}...") + print(f" Repo 1: {repo1_packages[package]}") + print(f" Repo 2: {repo2_packages[package]}") + + # Find contracts in both packages + repo1_contracts = find_contract_artifacts(repo1_packages[package]) + repo2_contracts = find_contract_artifacts(repo2_packages[package]) + + # Find common contracts + common_contracts = set(repo1_contracts.keys()) & set(repo2_contracts.keys()) + + if not common_contracts: + print(f" โŒ No common contracts found!\n") + continue + + print(f" ๐Ÿ“Š Found {len(common_contracts)} common contracts") + + package_identical = 0 + package_different = 0 + package_no_bytecode = 0 + + for contract_path in sorted(common_contracts): + # Get bytecode from both versions + bytecode1 = get_contract_bytecode(repo1_contracts[contract_path]) + bytecode2 = get_contract_bytecode(repo2_contracts[contract_path]) + + # Extract contract name for display + contract_name = Path(contract_path).stem + + if bytecode1 is None and bytecode2 is None: + print(f" โšช {contract_path}") + package_no_bytecode += 1 + total_no_bytecode += 1 + elif bytecode1 == bytecode2: + print(f" โœ… {contract_path}") + identical_contracts.append(f"{package}/{contract_path} ({contract_name})") + package_identical += 1 + total_identical += 1 + else: + print(f" ๐Ÿงจ {contract_path}") + different_contracts.append(f"{package}/{contract_path} ({contract_name})") + package_different += 1 + total_different += 1 + + total_compared += 1 + + print(f" ๐Ÿ“Š Package summary: {package_identical} identical, {package_different} different, {package_no_bytecode} no bytecode\n") + + # Overall summary + print("๐Ÿ“‹ OVERALL SUMMARY:\n") + + if identical_contracts: + print(f"โœ… FUNCTIONALLY IDENTICAL ({len(identical_contracts)} contracts):") + for contract in identical_contracts: + print(f" - {contract}") + print() + + if different_contracts: + print(f"๐Ÿงจ FUNCTIONAL DIFFERENCES ({len(different_contracts)} contracts):") + for contract in different_contracts: + print(f" - {contract}") + print() + else: + print("๐Ÿงจ FUNCTIONAL DIFFERENCES (0 contracts):") + print(" (none)\n") + + print(f"๐Ÿ“Š Final Summary:") + print(f" Packages compared: {len(common_packages)}") + print(f" Total contracts compared: {total_compared}") + print(f" No bytecode (interfaces/abstract): {total_no_bytecode}") + print(f" Functionally identical: {total_identical}") + print(f" Functional differences: {total_different}") + + if total_different == 0: + print(f"\n๐ŸŽ‰ SUCCESS: All contracts are functionally identical!") + print(f" Any differences were only in metadata hashes.") + else: + print(f"\nโš ๏ธ WARNING: {total_different} contracts have functional differences!") + print(f" Review the differences above before proceeding.") + + +def main(): + if len(sys.argv) != 3: + print("Usage: ./scripts/compare-repos.py ") + print("Example: ./scripts/compare-repos.py /path/to/repo-v3.4.1 /path/to/repo-v3.4.2") + sys.exit(1) + + repo1_path = Path(sys.argv[1]).resolve() + repo2_path = Path(sys.argv[2]).resolve() + + if not repo1_path.exists(): + print(f"โŒ Repository 1 does not exist: {repo1_path}") + sys.exit(1) + + if not repo2_path.exists(): + print(f"โŒ Repository 2 does not exist: {repo2_path}") + sys.exit(1) + + if repo1_path == repo2_path: + print(f"โŒ Both repository paths are the same: {repo1_path}") + sys.exit(1) + + compare_repositories(repo1_path, repo2_path) + + +if __name__ == "__main__": + main() From 3faf0552d4e84d26f270bdcddabb4b7da06c628f Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:47:50 +0000 Subject: [PATCH 09/10] fix(interfaces): add incremental build logic to avoid unnecessary rebuilding - Add timestamp-based checks for WAGMI, ethers-v5, and TypeScript compilation - Skip type generation when output files are newer than source files - Improve file-by-file comparison for dist directory organization - Reduce build time from 5+ seconds to ~600ms when no changes needed - Maintain build correctness while improving developer experience --- packages/interfaces/scripts/build.sh | 146 ++++++++++++++++++++------- 1 file changed, 112 insertions(+), 34 deletions(-) diff --git a/packages/interfaces/scripts/build.sh b/packages/interfaces/scripts/build.sh index 30f723a44..5c16d2864 100755 --- a/packages/interfaces/scripts/build.sh +++ b/packages/interfaces/scripts/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Complete build script for the interfaces package +# Complete build script for the interfaces package with incremental build support # This script handles: # 1. Hardhat compilation (generates artifacts and ethers-v6 types) # 2. Type generation (WAGMI and ethers-v5 types) @@ -8,42 +8,120 @@ set -e # Exit on any error -echo "๐Ÿ”จ Starting complete build process..." +echo "๐Ÿ”จ Starting build process..." + +# Helper function to check if target is newer than sources +is_newer() { + local target="$1" + shift + local sources=("$@") + + # If target doesn't exist, it needs to be built + if [[ ! -e "$target" ]]; then + return 1 + fi + + # Check if any source is newer than target + for source in "${sources[@]}"; do + if [[ -e "$source" && "$source" -nt "$target" ]]; then + return 1 + fi + done + + return 0 +} + +# Helper function to find files matching patterns +find_files() { + local pattern="$1" + find . -path "$pattern" -type f 2>/dev/null || true +} # Step 1: Hardhat compilation echo "๐Ÿ“ฆ Compiling contracts with Hardhat..." -hardhat compile - -# Step 2: Generate types -echo "๐Ÿ—๏ธ Generating type definitions..." - -# Build wagmi types -echo " - Generating WAGMI types..." -pnpm wagmi generate - -# Build ethers-v5 types -echo " - Generating ethers-v5 types..." -pnpm typechain \ - --target ethers-v5 \ - --out-dir types-v5 \ - 'artifacts/contracts/**/!(*.dbg).json' \ - 'artifacts/@openzeppelin/**/!(*.dbg).json' - -# Step 3: TypeScript compilation -echo "๐Ÿ”ง Compiling TypeScript..." - -# Compile v6 types (default tsconfig) -echo " - Compiling ethers-v6 types..." -tsc - -# Compile v5 types (separate tsconfig) -echo " - Compiling ethers-v5 types..." -tsc -p tsconfig.v5.json - -# Step 4: Merge v5 types into dist directory -echo "๐Ÿ“ Organizing compiled types..." -mkdir -p dist/types-v5 -cp -r dist-v5/* dist/types-v5/ +pnpm hardhat compile + +# Step 2: Generate types (only if needed) +echo "๐Ÿ—๏ธ Checking type definitions..." + +# Check if WAGMI types need regeneration +wagmi_sources=( + "wagmi.config.mts" + $(find_files "./artifacts/contracts/**/!(*.dbg).json") +) +if ! is_newer "wagmi/generated.ts" "${wagmi_sources[@]}"; then + echo " - Generating WAGMI types..." + pnpm wagmi generate +else + echo " - WAGMI types are up to date" +fi + +# Check if ethers-v5 types need regeneration +v5_artifacts=($(find_files "./artifacts/contracts/**/!(*.dbg).json") $(find_files "./artifacts/@openzeppelin/**/!(*.dbg).json")) +if ! is_newer "types-v5/index.ts" "${v5_artifacts[@]}"; then + echo " - Generating ethers-v5 types..." + pnpm typechain \ + --target ethers-v5 \ + --out-dir types-v5 \ + 'artifacts/contracts/**/!(*.dbg).json' \ + 'artifacts/@openzeppelin/**/!(*.dbg).json' +else + echo " - ethers-v5 types are up to date" +fi + +# Step 3: TypeScript compilation (only if needed) +echo "๐Ÿ”ง Checking TypeScript compilation..." + +# Check if v6 types need compilation +v6_sources=( + "hardhat.config.ts" + $(find_files "./src/**/*.ts") + $(find_files "./types/**/*.ts") + $(find_files "./wagmi/**/*.ts") +) +if ! is_newer "dist/tsconfig.tsbuildinfo" "${v6_sources[@]}"; then + echo " - Compiling ethers-v6 types..." + pnpm tsc + touch dist/tsconfig.tsbuildinfo +else + echo " - ethers-v6 types are up to date" +fi + +# Check if v5 types need compilation +v5_sources=($(find_files "./types-v5/**/*.ts")) +if ! is_newer "dist-v5/tsconfig.v5.tsbuildinfo" "${v5_sources[@]}"; then + echo " - Compiling ethers-v5 types..." + pnpm tsc -p tsconfig.v5.json + touch dist-v5/tsconfig.v5.tsbuildinfo +else + echo " - ethers-v5 types are up to date" +fi + +# Step 4: Merge v5 types into dist directory (only if needed) +needs_copy=false +if [[ -d "dist-v5" ]]; then + if [[ ! -d "dist/types-v5" ]]; then + needs_copy=true + else + # Check if any file in dist-v5 is newer than the corresponding file in dist/types-v5 + while IFS= read -r -d '' file; do + relative_path="${file#dist-v5/}" + target_file="dist/types-v5/$relative_path" + if [[ ! -e "$target_file" || "$file" -nt "$target_file" ]]; then + needs_copy=true + break + fi + done < <(find dist-v5 -type f -print0) + fi +fi + +if [[ "$needs_copy" == "true" ]]; then + echo "๐Ÿ“ Organizing compiled types..." + mkdir -p dist/types-v5 + cp -r dist-v5/* dist/types-v5/ +else + echo "๐Ÿ“ Compiled types organization is up to date" +fi echo "โœ… Build completed successfully!" echo "๐Ÿ“„ Generated types:" From 27cade3493ca389601a460b8d3e0a5a7a48e1235 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:23:47 +0000 Subject: [PATCH 10/10] fix(horizon): respect minimum delegation requirement in slash test The testSlash_RoundDown_TokensThawing_Delegation test was failing because it could generate scenarios where undelegating would leave less than the minimum delegation amount (1 ether) in the pool, which violates the protocol's minimum delegation constraint. Added assumption to ensure undelegation either removes all tokens or leaves at least MIN_DELEGATION in the pool, making the test compliant with the protocol's validation rules introduced in commit 91cda561. --- packages/horizon/test/unit/staking/slash/slash.t.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/horizon/test/unit/staking/slash/slash.t.sol b/packages/horizon/test/unit/staking/slash/slash.t.sol index e5c365d67..3f4c4e63e 100644 --- a/packages/horizon/test/unit/staking/slash/slash.t.sol +++ b/packages/horizon/test/unit/staking/slash/slash.t.sol @@ -172,6 +172,8 @@ contract HorizonStakingSlashTest is HorizonStakingTest { vm.assume(delegationTokensToSlash <= delegationTokens); vm.assume(delegationTokensToUndelegate <= delegationTokens); vm.assume(delegationTokensToUndelegate > 0); + // Ensure that after undelegating, either we undelegate everything or leave at least MIN_DELEGATION + vm.assume(delegationTokensToUndelegate == delegationTokens || delegationTokens - delegationTokensToUndelegate >= MIN_DELEGATION); resetPrank(users.delegator); _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0);